2024 年6月3日,备受瞩目的数据分析引擎DuckDB迎来了一个重要的里程碑 ——1.0.0 版本正式发布。
这个版本的代号为 “Snow Duck”(雪鸭),寓意着 DuckDB 在数据分析领域已经达到了一个新的高度,DuckDB 终于可以放心的应用于生产力环境了。
什么是 DuckDB?
DuckDB 是一个高性能的分析型关系数据库,旨在实现高效的数据分析。它易于安装,运行速度非常快,并且可以在进程内 (in-process) 运行。
该项目始于 2018 年,经过近6年的打磨,如今已发展成为一个拥有 30 多万行的C++数据库引擎代码、4.2 万次代码提交、解决了4000 个 issue 的成熟开源项目。
DuckDB 完全用 C++ 编写,是一个采用矢量化执行引擎的数据库管理系统。两位创始人将其称为“用于分析的 SQLite”。
如果查看 DuckDB 的网站,在其主页上看到的介绍就是:DuckDB 是一个进程内 SQL OLAP 数据库管理系统。
综合起来就是:
· DuckDB 是一个开源 OLAP 数据库,专为管理数据分析而设计。与 SQLite 类似,它是一个可以嵌入到您的应用程序中的进程内数据库。
· 在进程内数据库中,引擎驻留在应用程序内,允许在同一内存地址空间内传输数据。这消除了通过套接字复制大量数据的需要,从而提高了性能。
· DuckDB 利用矢量化查询处理,可在 CPU 缓存内实现高效操作,并最大限度地减少函数调用开销。
· 在 DuckDB 中使用 Morsel-Driven 的并行性可以实现跨多个核心的高效并行化,同时保持对多核处理的感知。
上面的介绍中,出现了不少新名词,都是一些学术性的描述。
那么,简单直白的说人话就是,DuckDB是一个能够搞并行分析的单机版数据库,它甚至不需要安装,直接一个DLL就能使用,这也就是“进程内”的意思。这就意味着你可以把它当做一个在你自己的主程序内直接运行的数据库,免去了不同进程之间数据交换的性能损失和其他风险。
那么,从上面的介绍就可以看出,DuckDB非常像传统的SQLite数据库。
SQLite数据库是什么呢?
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。比如在你的手机微信里面就内置有一个SQLite。
SQLite官网的介绍是:SQLite不与客户端/服务器数据库竞争。 SQLite 是与C语言的fopen函数竞争的。换句话说,它其实是一个文件开启和关闭的方便的工具,而恰好它还提供了一部分数据库的操作功能。
这里解释一下,什么是嵌入式数据库:
从软件角度来说,数据库分类为两种:
- 第一种:数据库服务器(Database Server)
- 第二种:嵌入式数据库(Embedded Database)
像 Oracle、PostgreSQL、MySQL 和 SQL Server 等这些大家熟知的数据库,我们一般称它为数据库服务器,当然也不排除某些数据库也提供嵌入式版本,例如 MySQL Embedded 就是一个嵌入式的数据库。
而像 SQLite、DuckDB、Berkeley DB、Derby、H2、HSQL DB 等数据库,一本内嵌在应用程序中,与应用程序一起运行,我们称它为嵌入式数据库。
嵌入式数据库跟数据库服务器最大的区别在于它们运行的地址空间不同。通常,数据库服务器独立地运行一个守护进程,而嵌入式数据库与应用程序运行在同一个进程。
那么数据库概念中,什么OLAP,什么是OLTP呢?
一般而言,数据处理大致可以分成两大类:
在线事务处理OLTP(on-line transaction processing);
在线分析处理OLAP(On-Line
Analytical Processing)。
在线事务处理(OLTP)是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLTP表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的处理和执行SQL的数量。在这样的系统中,单个数据库每秒处理的Transaction往往超过几百个,或者是几千个,Select 语句的执行量每秒几千甚至几万个。
在线分析处理 (OLAP) 是一种用于对大量数据进行高速多维分析的系统。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。OLAP就是我们说的数据仓库。在这样的系统中,语句的执行量不是考核标准,因为一条语句的执行时间可能会非常长,读取的数据也非常多。在这样的系统中,考核的标准往往是磁盘子系统的吞吐量(带宽),如能达到多少MB/s的流量。
那么为什么使用DuckDB呢?
它是一个高性能工具。正如 GitHub 页面所示:“它的设计目标是快速、可靠且易于使用。”
• 它的创建是为了支持分析查询工作负载 (OLAP)。它们的方式是通过向量化查询执行(面向列),而前面提到的其他 DBMS(SQLite、PostgreSQL…)则是按顺序处理每一行。这就是其性能提高的原因。
• DuckDB 采用了 SQLite 的最佳特性:简单性。DuckDB 开发人员在看到 SQLite 的成功后,选择安装简单性和嵌入式进程内操作作为 DBMS。
• 此外 DuckDB 没有外部依赖项,也没有需要安装、更新或维护的服务器软件。如前所述,它是完全嵌入式的,这具有与数据库之间进行高速数据传输的额外优势。
• 功能完备。支持 SQL 中的复杂查询,提供事务保证( ACID 属性),支持二级索引以加速查询……更重要的是深度集成到 Python 和 R 中,以实现高效的交互式数据分析
那么什么时候用SQLite,什么时候用DuckDB呢?
当我们想要在本地环境中工作时,一般倾向于默认使用 SQLite。
当你仅仅需要处理数据存储和取用这些简单的数据分析任务时,你直接使用SQLite就行了。这也是我之前在通达信上主要采用的方案,比如设计了数据库版的吸星大法来下载数据。
但是当数据分析任务一旦上了规模,数据处理业务一旦复杂度上升,SQLite这种可能就不是好选择了。这时候,如果我们想用SQLite进行详尽的数据分析,它太慢了。这就像骑自行车去 100 公里之外的使用场景一样:虽然能用,但真不是最好的选择。这时候,你就可以考虑上DuckDB了。注意:这时候我们的最优选择仍然是采用进程内数据库。
DuckDB使用方法
上面仔细剖析了各种数据库的分类,以及DuckDB和Sqlite数据库的区别,这里简单演示一下DuckDB的用法。
熟悉了它的调用语法,你会发现它的处理逻辑跟SQlite几乎一样。这能够方便后续你在自己的生产力环境中采用。
首先从GitHub官网下载它的全部源码,
1.0版正式版的DuckDB编译完成之后,会生成所需要的dll文件。
这个dll文件包含了将近2662个函数,里面包含了我们需要的一切。
有了这个DLL,我们就可以用任何程序进行调用了。
下面演示一下这个数据库的使用方法。
这里我们简单用JS脚本来处理一个试试,来看看它的使用有多么方便(其它语言的调用逻辑跟这个也基本是一样的):
function main()
{
let db=duckdb.duckdb_open(".\\test.db");
if(db===0){
console.log("db open error!")
return ;
}
let con=duckdb.duckdb_connect(db);
duckdb.duckdb_query(con,
"drop table if exists integers;CREATE TABLE integers(i INTEGER, j INTEGER);");
duckdb.duckdb_query(con,
"INSERT INTO integers VALUES (3, 4), (5, 6), (7, NULL);");
let result=duckdb.duckdb_query(con, "SELECT * FROM integers",1);
let row_count =duckdb.duckdb_row_count(result);
let column_count = duckdb.duckdb_column_count(result);
console.log("row_count",row_count,typeof row_count ); //
console.log("column_count",column_count,typeof column_count);//
let str="";
for (let i = 0; i <
column_count; i++) {
str+= duckdb.duckdb_column_name( result, i);
}
console.log("name",str);
for (let row_idx = 0; row_idx< row_count; row_idx++) {
let vals=[];
for (let col_idx = 0;col_idx < column_count; col_idx++) {
let val =duckdb.duckdb_value_varchar(result, col_idx, row_idx);
vals.push(val);
}
console.log(vals);
}
console.log("done");
duckdb.duckdb_destroy_result(result);
duckdb.duckdb_disconnect(con);
duckdb.duckdb_close(db);
console.log("close");
}
main();
上面的程序,是一个简单的数据库生成和调用的例子。
上面JS脚本的输出如下:
row_count 3 bigint
column_count 2 bigint
name ij
3,4
5,6
7,null
done
close
这个例子中,我们生成了一个数据表integers,里面含有两个整数i和j;之后插入3组数据;最后调用查询语句,把数据都查询出来。
这个例子,基本上把常用数据库的制作、数据插入、数据查询等常见操作都演示了。实际设计和处理数据库时,可以参考上面的调用流程。
介绍了那么多特性,最后来概括一下,为什么采用DuckDB数据库呢?
DuckDB可以简单认为它就是一个DLL,可以在同一个进程内调用,无需在本机安装,就可以直接使用。
它是一个具有并行计算、分析能力的数据库,其计算能力远超过SQLite。
所以,在需要对大量的数据进行高级计算分析时,请选用DuckDB,否则可简单选用SQLite。如果数据量更大、更复杂,则可以选用其他更加高级、更加复杂的数据库。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/109110
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!