首页  

DuckDB OLAP数据库介绍     所属分类 duckdb 浏览量 206
https://github.com/duckdb

DuckDB is an analytical in-process SQL database management system



DuckDB 是一个 In-Process 的 OLAP 数据库,可以理解为 AP 版本的 SQLite,但其底层是列式存储。
2019 年 SIGMOD 有一篇 Demo 论文介绍 DuckDB:an embedded analytical database

随着单机内存的变大,大部分 OLTP 数据库都能在内存中放得下,而很多 OLAP 也有在单机就能搞定的趋势。
单台服务器的内存很容易达到 TB,加上 SSD,搞个几十甚至上百 TB 很容易。
DuckDB 就是为了填补这个空白而生的。

DuckDB 采用 MIT 协议开源,是荷兰 CWI 数据库组的一个项目,
学术气息比较浓厚,项目的组织很有教科书的感觉,架构很清晰,适合阅读学习。

DuckDB是一个免费的、开源的、嵌入式数据库管理系统,专为数据分析和在线分析处理而设计。


DuckDB 优点 易于安装、部署和使用 功能丰富,支持完整的SQL标准、事务、二级索引,并且与流行的数据分析编程语言如 Python 和 R 集成良好 免费 开源 兼容性很好,几乎无依赖性,甚至可在浏览器中运行 灵活的扩展机制,支持从 CSV、JSON、Parquet、MySQL S3 读取数据 支持数据超出内存限制但小于磁盘容量的数据分析任务 ,数据分析可通过 便宜的硬件来完成
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 最开始采用了基于 Pull-based 的 Vector Volcano 的执行引擎,后来切换到了 Push-based 的 pipelines 执行方法。 采用向量化计算来来加速计算,具有内部实现的多种类型的 vector 以及向量化的 operator。 另外出于可移植性原因,没有采用 JIT,因为 JIT引擎依赖于大型编译器库(例如LLVM),具有额外的传递依赖。 5).Transactions 通过 MVCC 提供了 ACID 的特性,实现了HyPer专门针对混合OLAP / OLTP系统定制的可串行化MVCC 变种 。 该变种立即 in-place 更新数据,并将先前状态存储在单独的 undo buffer 中,以供并发事务和 abort 使用 6).Persistent Storage 使用面向读取优化的 DataBlocks 存储布局(单个文件)。 逻辑表被水平分区为 chunks of columns,并使用轻量级压缩方法压缩成 physical block , 每个块都带有每列的min/max 索引,以便快速确定它们是否与查询相关。 此外,每个块还带有每列的轻量级索引,可以进一步限制扫描的值数量。
简单使用 duckdb.org java版本 org.duckdb:duckdb_jdbc:0.10.3 ./duckdb 默认运行在内存中 ./duckdb testdb 持久化方式 create table t1( a int,b int); insert into t1 values(1,1); select * from t1; update t1 set b=2 where a=1; 查看表结构 describe t1; 读取外部数据 select * from read_csv('data.csv'); 加载数据到本地 create table csv_table as select * from read_csv('data.csv'); select count(*) from csv_table; 复制数据 COPY csv_table FROM 'data.csv'; select count(*) from csv_table;
数据字典 参考 MySQL 实现一组数据字典,此外也提供部分函数作为补充 -- information_schema information_schema.schemata: Database, Catalog and Schema information_schema.tables: Tables and Views information_schema.columns: Columns information_schema.character_sets: Character Sets information_schema.key_column_usage: Key Column Usage information_schema.referential_constraints: Referential Constraints information_schema.table_constraints: Table Constraints -- catalog function current_catalog() Return the name of the currently active catalog. Default is memory. current_schema() Return the name of the currently active schema. Default is main. current_schemas(boolean) Return list of schemas. Pass a parameter of true to include implicit schemas.
性能调优 性能调优主要涉及到参数、执行计划等 ,使用 Explain 命令查看执行计划 explain select deptno,count(*) from big_emp group by deptno;

上一篇     下一篇
ETF投资技巧

指数和ETF指标计算统计

grafana静音设置

hutool简介

grafana 连接 skywalking promQL 数据源 ,慢SQL告警

高手止于均线