Query Engine
介绍
GreptimeDB 的查询引擎基于 Apache DataFusion。DataFusion 提供逻辑计划、物理计划、优化器框架和执行运行时;GreptimeDB 在此基础上增加各查询语言的 planner、存储相关优化规则、自定义计划节点和分布式执行。
DDL 和其他控制面操作由 statement executor 分发。Query engine 接收数据处理计划,包括 INSERT ... SELECT 等操作中读取输入数据的部分。
查询生命周期
- SQL、PromQL 或日志查询 planner 通过 catalog 解析表,并生成 DataFusion logical plan。DataFusion 不直接支持的操作由 GreptimeDB plan extension 表示。
- DataFusion 的 analyzer 和 optimizer rule 与 GreptimeDB rule 共同运行。这些规则规范化表达式和类型、改写时间范围操作、将 projection 和 filter 下推到 scan,并在需要时引入分布式计划节点。
- Physical planner 将优化后的 logical plan 转换为流式 operator。GreptimeDB 随后应用 scan 并行度、排序和分布式执行相关的 physical rule。
- 执行阶段通过 physical plan 拉取 Arrow record batch。存储 scan 接收 projection 和 predicate,下 游 operator 消费数据流,无需先物化完整结果。
使用 EXPLAIN 查看逻辑和物理计划。EXPLAIN ANALYZE 还会执行计划并报告运行时指标。
数据表示
GreptimeDB 使用 Apache Arrow record batch 作为内存数据表示。一个 record batch 包含等长的列数组和 schema。查询 operator 交换这些 batch 组成的数据流,使 Region scan 到结果编码的执行路径保持列式处理。
索引
索引构建和持久化格式属于存储引擎。查询层向 scan 提供 predicate 和 projection,Mito 再利用时间范围、Parquet 统计信息和索引跳过不可能匹配的数据。参见数据持久化与索引。
分布式执行
分布式模式下,Frontend 规划集群级查询,Datanode 执行 Region 本地子计划。MergeScan 是两个阶段之间的边界。