弹性 在 Databend 中,存储和计算资源可以按需、按量弹性扩展。 安全 Databend 中数据文件和网络传输都是端到端加密,并在 SQL 级别提供基于角色的权限控制。 易用 Databend 兼容 ANSI SQL,并可以使用 MySQL 和 ClickHouse 客户端接入,几乎无学习成本。 成本 Databend 处理查询非常高效,用户只需要为使用的资源付费。

1
Meta Service Layer
Metadata : 表的元信息、索引信息、集群信息、事务信息等。 Administration:用户系统、用户权限等信息。 Security :用户登录认证、数据加密等。
2
Compute Layer
执行计划 (Planner)
比如语句
SELECT number + 1 FROM numbers_mt(10) WHERE number > 8 LIMIT 2
执行计划:
datafuse :) EXPLAIN SELECT number + 1 FROM numbers_mt(10) WHERE number > 8 LIMIT 2
┌─explain─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Limit: 2 │
│ Projection: (number + 1):UInt64 │
│ Expression: (number + 1):UInt64 (Before Projection) │
│ Filter: (number > 8) │
│ ReadDataSource: scan partitions: [1], scan schema: [number:UInt64], statistics: [read_rows: 10, read_bytes: 80] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
这个执行计划自下而上分别是 :
ReadDataSource:表示从哪些文件里读取数据
Filter: 表示要做 (number > 8) 表达式过滤
Expression: 表示要做 (number + 1) 表达式运算
Projection: 表示查询列是哪些
Limit: 表示取前 2 条数据
优化器 (Optimizer)
处理器 (Processors)
datafuse :) EXPLAIN PIPELINE SELECT number + 1 FROM numbers_mt(10000) WHERE number > 8 LIMIT 2
┌─explain───────────────────────────────────────────────────────────────┐
│ LimitTransform × 1 processor │
│ Merge (ProjectionTransform × 16 processors) to (LimitTransform × 1) │
│ ProjectionTransform × 16 processors │
│ ExpressionTransform × 16 processors │
│ FilterTransform × 16 processors │
│ SourceTransform × 16 processors │
└───────────────────────────────────────────────────────────────────────┘
同样,理解这个 Pipeline 我们自下而上来看:
SourceTransform:读取数据文件,16 个物理 CPU 并行处理
FilterTransform:对数据进行 (number > 8) 表达式过滤,16 个物理 CPU 并行处理
ExpressionTransform:对数据进行 (number + 1) 表达式执行,16 个物理 CPU 并行处理
ProjectionTransform:对数据处理生成最终列
LimitTransform:对数据进行 Limit 2 处理,Pipeline 进行折叠,由一个物理 CPU 来执行
Datafuse 通过 Pipeline 并行模型,并结合向量计算最大限度的去压榨 CPU 资源,以加速计算。
缓存 ( Cache )
缓存的预热方式有:
LOAD_ON_DEMAND - 按需加载索引或数据块(默认)。 LOAD_INDEX - 只加载索引。 LOAD_ALL - 加载全部的数据和索引,对于较小的表可以采取这种模式。
3
Storage Layer
min_max.idx Parquet 文件 minimum 和 maximum 值 sparse.idx 以 N 条记录为颗粒度的稀疏索引
假设有两个Parquet 文件:f1, f2,f1 的 min_max.idx: [3, 5] ;f2 的 min_max.idx: [4, 6] 。如果查询条件为:where x < 4 , 我们只需要 f1 文件就可以,再根据 sparse.idx 索引定位到 f1 文件中的某个数据页。
项目地址
代码地址: https://github.com/datafuselabs/databend
加入 Datafuse 用户群





