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

大家好,今天给大家分享的是一个开源的面向列的关系数据库管理系统(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 mainimport ("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   intname 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 DBdb.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/351963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea 配置文件中文乱码

再进行springboot项目开发时发现新建的配置文件中文注释乱码&#xff0c;如下: 处理办法: 1、打开idea&#xff0c;在 File 中找到 Settings,如下图 2、搜索 encodings 找到 File Encodings&#xff0c;如下图 3、将上图中圈上的地方全部改为 UTF-8 编码最后点击 Apply 应用即…

RabbitMQ学习总结

目录 一:介绍 二:应用场景 三:工作原理 组成部分说明 消息发布接收流程 四:下载安装 五:环境搭建 创建Maven工程 生产者 消费者 六:工作模式 Work queues Publish/subscribe 生产者 消费者 Routing 生产者 ​消费者 思考 Topics 生产者 匹配规则…

[FFmpeg学习]windows环境sdl播放音频试验

参考资料&#xff1a; FFmpeg和SDL2播放mp4_sdl 播放mp4 声音-CSDN博客 SimplePlayer/SimplePlayer.c at master David1840/SimplePlayer GitHub 在前面的学习中&#xff0c;通过获得的AVFrame进行了播放画面&#xff0c; [FFmpeg学习]初级的SDL播放mp4测试-CSDN博客 播放…

数据中心布线管理:预标记线缆与移动扫描技术的融合

随着信息技术的飞速发展&#xff0c;数据中心布线管理面临着前所未有的挑战。传统的布线管理方式已无法满足现代数据中心高效、准确和可靠的需求。在这样一个背景下&#xff0c;预标记线缆与移动扫描技术的结合&#xff0c;为数据中心布线管理带来了革命性的解决方案。 布线管理…

opencv安装笔记 各种平台

目录 python安装opencv-python c 麒麟arm系统安装和用法 python安装opencv-python pypi上搜索 Search results PyPI 现在安装是一个版本&#xff0c;大于3.6都可以安装 c 麒麟arm系统安装和用法 参考&#xff1a; ffmpeg rknn麒麟系统 安装 opencv_ffmpeg4 解码示例-CSDN…

C#下WinForm多语种切换

这是应一个网友要求写的&#xff0c;希望对你有所帮助。本文将介绍如何在一个WinForm应用程序中实现多语种切换。通过一个简单的示例&#xff0c;你将了解到如何使用资源文件管理不同语言的文本&#xff0c;并通过用户界面实现语言切换。 创建WinForm项目 打开Visual Studio&a…

【一步一步了解Java系列】:认识String类

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭…

【Netty】nio阻塞非阻塞Selector

阻塞VS非阻塞 阻塞 阻塞模式下&#xff0c;相关方法都会导致线程暂停。 ServerSocketChannel.accept() 会在没有建立连接的时候让线程暂停 SocketChannel.read()会在没有数据的时候让线程暂停。 阻塞的表现就是线程暂停了&#xff0c;暂停期间不会占用CPU&#xff0c;但线程…

ANSYS EMC解决方案与经典案例

EMC问题非常复杂&#xff0c;各行各业都会涉及&#xff0c;例如航空、航天、船舶、汽车、火车、高科技、物联网、消费电子。要考虑EMC的对象很多&#xff0c;包含整个系统、设备、PCB、线缆、电源、芯片封装。而且技术领域覆盖广&#xff0c;涉及高频问题、低频问题&#xff1b…

Databricks超10亿美元收购Tabular;Zilliz 推出 Milvus Lite ; 腾讯云支持Redis 7.0

重要更新 1. Databricks超10亿美元收购Tabular&#xff0c;Databricks将增强 Delta Lake 和 Iceberg 社区合作&#xff0c;以实现 Lakehouse 底层格式的开放与兼容([1] [2])。 2. Zilliz 推出 Milvus Lite 轻量级向量数据库&#xff0c;支持本地运行&#xff1b;Milvus Lite 复…

统计信号处理基础 习题解答10-16

题目&#xff1a; 对于例10.1&#xff0c;证明由观察数据得到的信息是&#xff1a; 解答&#xff1a; 基于习题10-15的结论&#xff0c;&#xff0c;那么&#xff1a; 而根据习题10-15的结论&#xff1a; 此条件概率也是高斯分布&#xff0c;即&#xff1a; 根据相同的计算&a…

win10能用微信、QQ,不能打开网页

今天上班&#xff0c;打开电脑&#xff0c;突然遇到一个问题&#xff0c;发现QQ、微信可以登录&#xff0c;但是任何网页都打不开&#xff0c;尝试了重启电脑和路由器都不行&#xff0c;最终解决了电脑可以访问网页的问题&#xff0c;步骤如下&#xff1a; 1、打开电脑的网络设…

Parallels Desktop 19 for mac破解版安装激活使用指南

Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机&#xff0c;并于其中装设不同的操作系统&#xff0c;如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时&#xff0c;您可在 …

QT实现QGraphicsView绘图 重写QGraphicsSvgItem类实现边框动画

目录导读 简述使用 QTimer 实现 QGraphicsSvgItem 边框动画效果 简述 在了解学习WPS的流程图的时候&#xff0c;发现它这个选择图元有个动态边框效果&#xff0c;而且连接线还会根据线生成点从头移动到尾的动画。像这种&#xff1a; 在QML中实现这种动画属性很简单&#xff0…

11.1 Go 标准库的组成

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Vue54-浏览器的本地存储webStorage

一、本地存储localStorage的作用 二、本地存储的代码实现 2-1、存储数据 注意&#xff1a; localStorage是window上的函数&#xff0c;所以&#xff0c;可以把window.localStorage直接写成localStorage&#xff08;直接调用&#xff01;&#xff09; 默认调了p.toString()方…

Linux中文件查找相关命令比较

Linux中与文件定位的命令有find、locate、whereis、which&#xff0c;type。 一、find find命令最强&#xff0c;能搜索各种场景下的文件&#xff0c;需要配合相关参数&#xff0c;搜索速度慢。在文件系统中递归查找文件。 find /path/to/search -name "filename"…

UniVue更新日志:使用ObservableList优化LoopList/LoopGrid组件的使用

github仓库 稳定版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&#xff1a;https://github.com/Avalon712/UniVue-Develop UniVue扩展框架-UniVue源生成器仓库&#xff1a;https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 如果大家…

【电机控制】FOC算法验证步骤——PWM、ADC

【电机控制】FOC算法验证步骤 文章目录 前言一、PWM——不接电机1、PWMA-H-50%2、PWMB-H-25%3、PWMC-H-0%4、PWMA-L-50%5、PWMB-L-75%6、PWMC-L-100% 二、ADC——不接电机1.电流零点稳定性、ADC读取的OFFSET2.电流钳准备3.运放电路分析1.电路OFFSET2.AOP3.采样电路的采样值范围…

小白Linux提权

1.脏牛提权 原因&#xff1a; 内存子系统处理写入复制时&#xff0c;发生内存条件竞争&#xff0c;任务执行顺序异常&#xff0c;可导致应用崩溃&#xff0c;进一步执行其他代码。get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中&#xff0c;可能产出竞态…