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查询语言,并提供了一系列高级

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

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

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

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

前端:异地登录!!!

哈喽,大家好 !今天来聊一聊前端怎么实现异地登录提示!!! 在数字化时代,账户安全是每个用户和开发者都不容忽视的问题。 异地登录提示是一种安全措施,用于提醒用户他们的账户可能在不同的位置被访问。 这通常涉及到检测登录行为的异常,比如IP地址的变化,并在检测到异常时通知用户。 用户登录记录的重要性 首

带团队后的日常思考(十五)

一、日常问题 1)CDN 异常 5 月中旬,发现图像异常的上报量比平时多了 10 多倍,日常 300 多,现在 4000 多。 但是看不到异常的错误码,不能确定是域名问题还是服务问题。还特地查看了错误分布的时间段,但并没有看出说明规律。 本来以为是证书的问题,因为正好那几天证书到期了,但是证书更新后

记一次ThreadLocal中的用户信息混乱问题

记录一次开发中遇到的关于 ThreadLocal 问题,场景是数据库表中的操作人总是无缘无故的被更改,排查了几遍代码才发现是 ThreadLocal 没有及时清理导致的。

C#实现图片转Base64字符串.并支持markdown文件打开展示

引用1.0.3版本或以上的Wesky.Net.OpenTools 包 1.0.3 版本提供图片转Base64字符串方案,并提供根据后缀名自动识别Mime类型,合成标准URI 开源项目地址: Gitee:https://gitee.com/dreamer_j/open-tools.git Github

easyExcel多行表头设定不同样式和特定单元格设定样式的实现

前言 有个需求,需要设置Excel导出的样式,样式如下图所示,有三个表头行,第一个表头行需要加粗和灰色背景,另外两个表头行使用另外的样式,并且当测试结果单元格出现x或者未通过的时候,设置其为红色字体。 实现步骤 写入ExcelSheet的部分代码 for (Map.Entry

记录一个HttpClient超时连接配置不生效的问题排查过程

现象 首先有一个被服务由于内存有限,导致巨卡。导致调用他的服务出现线程阻塞。jstack打印线程池如下所示: 开始排查解决问题 第一步:检查代码看是否超时设置是否正确,因为感觉超时设置正确不可能阻塞。 找到注入client的位置: 发现配置没有任何问题,此时感到了一点点慌张。(内心OS: 难不成Ht

深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)

本系列深入分析编译器对于C++虚函数的底层实现,最后分析C++在多态的情况下的性能是否有受影响,多态究竟有多大的性能损失。