18.9k star!一个高性能的嵌入式分析型数据库,主要用于数据分析和数据处理任务。

9k,star · 浏览次数 : 0

小编点评

DuckDB是一个开源的面向列的关系数据库管理系统(RDBMS),专为数据科学家、分析师和数据工程师设计。它具有高性能的数据分析和处理能力,支持SQL查询语言,并提供一系列高级功能,如窗口函数、时间序列分析、地理空间数据处理等。DuckDB采用列式存储格式,支持多种数据类型,具有向量化执行引擎,能够高效地处理大量数据。此外,DuckDB还支持并行计算和分布式计算,可扩展性强,且提供丰富的API和插件系统。它是一个免费的开源项目,可在多种操作系统和CPU架构上部署。

正文

大家好,今天给大家分享的是一个开源的面向列的关系数据库管理系统(RDBMS)。

图片

DuckDB是一个嵌入式的分析型数据库,它提供了高性能的数据分析和数据处理能力。DuckDB的设计目标是为数据科学家、分析师和数据工程师提供一个快速、灵活且易于使用的数据分析工具。它支持SQL查询语言,并提供了一系列高级功能,如窗口函数、时间序列分析、地理空间数据处理等。

功能简介

DuckDB是一个高性能的嵌入式分析型数据库,主要用于数据分析和数据处理任务。以下是DuckDB的一些主要功能:

1.SQL查询:DuckDB支持标准的SQL查询语言,允许用户通过SELECT语句查询数据、使用JOIN操作连接表、使用WHERE子句过滤数据等。
2.数据类型支持:DuckDB支持多种数据类型,包括整数、浮点数、字符串、日期、时间、时间戳等。这使得用户可以处理各种类型的数据。
3.列式存储:DuckDB采用列式存储格式,能够高效地存储和检索大量数据。列式存储使得DuckDB在处理数据分析任务时具有更高的性能。
4.向量化执行引擎:DuckDB使用向量化执行引擎,可以高效地处理向量数据。这有助于提高查询性能,尤其是在处理大量数据时。
5.窗口函数:DuckDB支持窗口函数,允许用户在查询结果中对数据进行聚合,同时保留原始数据的行结构。窗口函数在数据分析中非常有用,例如计算累计和、移动平均等。
6.时间序列分析:DuckDB提供了时间序列分析功能,支持对时间序列数据进行操作,如按时间范围筛选数据、计算时间序列的统计指标等。
7.地理空间数据处理:DuckDB支持地理空间数据处理,允许用户查询和处理包含地理坐标的数据。这可以用于分析地理位置相关的数据,如距离计算、面积计算等。
8.并行计算和分布式计算:DuckDB支持并行计算和分布式计算,可以充分利用多核处理器和分布式系统的计算能力,提高查询性能。
9.多种编程语言支持:DuckDB提供了多种编程语言的API,如Python、R、Java等。这使得开发人员可以轻松地将DuckDB集成到他们的应用程序中,实现数据的快速分析和处理。
10.插件系统:DuckDB支持插件系统,允许用户扩展DuckDB的功能,以满足特定需求。

技术架构

图片

DuckDB 数据库可分为多个组件:Parser、Logical Planner、Optimizer、Physical Planner、Execution Engine、Transaction and Storage Managers。

1).Parser DuckDB SQL Parser 源自 Postgres SQL Parser。

2).Logical Planner 包含了两个过程 binder、plan generator。前者是解析所有引用的 schema 中的对象(如 table 或 view)的表达式,将其与列名和类型匹配。后者将 binder 生成的 AST 转换为由基本 logical query 查询运算符组成的树,就得到了一颗 type-resolved logical query plan。

3).Optimizer 优化器部分,会采用多种优化手段对 logical query plan 进行优化,最终生成 physical plan。例如,其内置一组 rewrite rules 来简化 expression tree,例如执行公共子表达式消除和常量折叠。针对表关联,会使用动态规划进行 join order 的优化,针对复杂的 join graph 会 fallback 到贪心算法会消除所有的 subquery。

4).Execution Engine DuckDB 最开始采用了基于 Pull-based 的 Vector Volcano 的执行引擎,后来切换到了 Push-based 的 pipelines 执行方法。DuckDB 采用了向量化计算来来加速计算,具有内部实现的多种类型的 vector 以及向量化的 operator。另外出于可移植性原因,没有采用 JIT,因为 JIT引擎依赖于大型编译器库(例如LLVM),具有额外的传递依赖。

5).Transactions DuckDB 通过 MVCC 提供了 ACID 的特性,实现了HyPer专门针对混合OLAP / OLTP系统定制的可串行化MVCC 变种 。该变种立即 in-place 更新数据,并将先前状态存储在单独的 undo buffer 中,以供并发事务和 abort 使用。

6).Persistent Storage DuckDB 使用面向读取优化的 DataBlocks 存储布局(单个文件)。逻辑表被水平分区为 chunks of columns,并使用轻量级压缩方法压缩成 physical block 。每个块都带有每列的min/max 索引,以便快速确定它们是否与查询相关。此外,每个块还带有每列的轻量级索引,可以进一步限制扫描的值数量。

项目优势

•简单的

SQLite 是世界上部署最广泛的 DBMS。安装简单、嵌入式进程内操作是其成功的关键。DuckDB 采用了这些简单和嵌入式操作的理念。

DuckDB 没有任何外部依赖,无论是编译时还是运行时。对于发布,DuckDB 的整个源代码树被编译成两个文件,一个头文件和一个实现文件,即所谓的“合并”。这大大简化了部署和集成到其他构建过程中的过程。对于构建,构建 DuckDB 所需的只是一个可用的 C++11 编译器。

•跨平台

由于没有依赖项,DuckDB 具有极高的可移植性。它可以针对所有主流操作系统(Linux、macOS、Windows)和 CPU 架构(x86、ARM)进行编译。它可以部署在从小型、资源受限的边缘设备到具有 100 多个 CPU 核心的大型多 TB 内存服务器中。使用DuckDB-Wasm,DuckDB 还可以在 Web 浏览器甚至手机上运行。

•功能丰富

DuckDB 提供严谨的数据管理功能。它拥有庞大的函数库、窗口函数等,广泛支持SQL 中的复杂查询。DuckDB通过我们定制的批量优化多版本并发控制 (MVCC)提供事务保证(ACID 属性) 。数据可以存储在持久的单文件数据库中。DuckDB 支持二级索引,以加快查找单个表条目的查询速度。

DuckDB与Python和R深度集成,可实现高效的交互式数据分析。

•高性能

DuckDB 包含一个列式矢量化查询执行引擎,其中查询仍被解释,但大量值(“矢量”)在一次操作中处理。这大大减少了传统系统(如 PostgreSQL、MySQL 或 SQLite)中存在的开销,这些系统按顺序处理每一行。矢量化查询执行可使 OLAP 查询的性能大大提高。

•可扩展

DuckDB 提供了灵活的扩展机制,允许定义新的数据类型、函数、文件格式和新的 SQL 语法。事实上,DuckDB 的许多关键功能(例如对Parquet 文件格式、JSON、时区的支持以及对HTTP(S) 和 S3 协议的支持)都是作为扩展实现的。扩展也可以在 DuckDB Wasm 中使用。

•开源免费

DuckDB是一个开源项目,用户可以自由地使用和修改其源代码。此外,DuckDB还提供了免费的社区版和商业版供用户选择。

•全面测试

DuckDB 的测试套件目前包含数百万个查询,包括改编自 SQLite、PostgreSQL 和 MonetDB 测试套件的查询。测试在各种平台和编译器上重复进行。每个拉取请求都会根据完整的测试设置进行检查,只有通过才会合并。

除了此测试套件之外,我们还运行各种测试,在高负载下对 DuckDB 进行压力测试。我们运行 TPC-H 和 TPC-DS 基准测试,并运行各种测试,其中许多客户端并行使用 DuckDB。

工程部署

查看官方部署指南[1]

图片

项目体验

•JAVA

安装

<dependency>
    <groupId>org.duckdb</groupId>
    <artifactId>duckdb_jdbc</artifactId>
    <version>1.0.0</version>
</dependency>

示例

Class.forName("org.duckdb.DuckDBDriver");
Connection conn = DriverManager.getConnection("jdbc:duckdb:");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT 42");

•C++

安装

https://github.com/duckdb/duckdb/releases/download/v1.0.0/libduckdb-osx-universal.zip

示例

DuckDB db(nullptr);
Connection con(db);
auto result = con.Query("SELECT 42");
result->Print();

•Go

安装

go get github.com/marcboeker/go-duckdb

示例

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/marcboeker/go-duckdb"
)

func main() {
    db, _ := sql.Open("duckdb", "")

    db.Exec(`CREATE TABLE person (id INTEGER, name VARCHAR)`)
    db.Exec(`INSERT INTO person VALUES (42, 'John')`)

    var (
        id   int
        name string
    )
    row := db.QueryRow(`SELECT id, name FROM person`)
    _ = row.Scan(&id, &name)
    fmt.Println("id:", id, "name:", name)
}

•Nodejs

安装

npm install duckdb

示例

var duckdb = require('duckdb');
var db = new duckdb.Database(':memory:'); // or a file name for a persistent DB
db.all('SELECT 42 AS fortytwo', function(err, res) {
  if (err) {
    console.warn(err);
    return;
  }
  console.log(res[0].fortytwo)
});

项目地址

https://github.com/duckdb/duckdb

References

[1] 官方部署指南: https://duckdb.org/docs/installation/?version=stable&environment=cli&platform=macos&download_method=package_manager

与18.9k star!一个高性能的嵌入式分析型数据库,主要用于数据分析和数据处理任务。相似的内容:

18.9k star!一个高性能的嵌入式分析型数据库,主要用于数据分析和数据处理任务。

大家好,今天给大家分享的是一个开源的面向列的关系数据库管理系统(RDBMS)。 DuckDB是一个嵌入式的分析型数据库,它提供了高性能的数据分析和数据处理能力。DuckDB的设计目标是为数据科学家、分析师和数据工程师提供一个快速、灵活且易于使用的数据分析工具。它支持SQL查询语言,并提供了一系列高级

FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg

​《FFmpeg开发实战:从零基础到短视频上线》一书的“第11章 FFmpeg的桌面开发”介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序,那么Windows系统通过Visual Studio开发桌面程序也是很常见的,下面就介绍如何在Visual Studio的C++工程中集成FFm

载均衡技术全解析:Pulsar 分布式系统的最佳实践

背景 Pulsar 有提供一个查询 Broker 负载的接口: /** * Get load for this broker. * * @return * @throws PulsarAdminException */ LoadManagerReport getLoadReport() throws

第二部分:关键技术领域的开源实践【内网穿透FRP】

FRP简介 FRP(Fast Reverse Proxy)作为一种高性能的内网穿透工具,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网IP节点(云服务器)的中转暴露到公网。 为什么使用 FRP ? 以下是一些常见的企业级应用场景: 远程办公和远程

Spring MVC 中 HttpMessageConverter 转换器

1. Spring MVC 中 HttpMessageConverter 转换器 @目录1. Spring MVC 中 HttpMessageConverter 转换器2. 补充:什么是 HTTP 消息3. 转换器3.1 转换器转换的是什么4. Spring MVC中的 AJAX 请求5. @Res

瓦片地图

1. 预备知识 1.1 参考椭球 地球表面是一个凸凹不平的表面,而对于地球测量而言,地表是一个无法用数学公式表达的曲面,这样的曲面不能作为测量和制图的基准面。假想一个扁率极小的椭圆,绕地球体短轴旋转所形成的规则椭球体称之为地球椭球体。 地球椭球体与地球形体非常接近,是一个形状规则的数学表面,在其上可

AI Agent技术的最新进展与改变世界的典型项目巡礼

AI Agent技术的最新进展与改变世界的典型项目巡礼 1. AI Agent 技术发展以及典型项目 1.0 前 AI Agent 时代 在学术探索的浩瀚星空中,机器人技术领域的璀璨明珠莫过于Agent技术的深入研究,这一领域历来是创新与突破的温床。回溯至大模型浪潮兴起之前,Agent技术的辉煌篇章

GCC8 编译优化 BUG 导致的内存泄漏

1. 背景 1.1. 接手老系统 最近我们又接手了一套老系统,老系统的迭代效率和稳定性较差,我们打算做重构改造,但重构周期较长,在改造完成之前还有大量的需求迭代。因此我们打算先从稳定性和迭代效率出发做一些微小的升级,其中一项效率提升便是升级编译工具 和 GCC 版本。 老系统使用 Autotools

中台框架模块开发实践-用 Admin.Core 代码生成器生成通用代码生成器的模块代码

之前分享中台 Admin.Core 的模块代码生成器,陆续也结合群友们的反馈,完善了一些功能和模板上的优化,而本篇将基于此代码生成器生成一个通用代码生成器模块的基本代码 后续再在此代码的基础上进行完善,制作一个通用的代码生成器

码农的转型之路-全力以赴升级物联网浏览器(IoTBrowser)

在人生的重要时刻,我站在了毕业的门槛上,望着前方的道路,心中涌动着对未来的无限憧憬与些许忐忑。面前,两条道路蜿蜒伸展:一是继续在职场中寻求稳定,一是勇敢地走出一条属于自己的创新之路。尽管面临年龄和现实的挑战,我仍旧选择勇往直前,用技术这把钥匙,开启新的人生篇章。 回首过去,我深知时间宝贵,精力有限。