Apache Arrow DataFusion 查询执行计划解析指南
引言
在数据库和查询引擎领域,理解查询执行计划是性能调优的关键。本文将深入介绍如何解析 Apache Arrow DataFusion 查询引擎生成的执行计划,帮助开发者更好地理解查询执行过程并识别潜在的性能瓶颈。
执行计划基础概念
DataFusion 采用查询计划(query plan)来执行 SQL 查询。要查看查询计划而不实际执行查询,可以在 SQL 查询前添加 EXPLAIN
关键字。
执行计划分为两种类型:
- 逻辑计划(Logical Plan):表示不考虑底层数据组织和硬件配置的抽象查询计划
- 物理计划(Physical Plan):考虑实际硬件配置和数据组织的具体执行方案
示例解析:选择与过滤查询
让我们通过一个具体示例来理解执行计划:
EXPLAIN FORMAT INDENT SELECT "WatchID" AS wid, "hits.parquet"."ClientIP" AS ip
FROM 'hits.parquet'
WHERE starts_with("URL", 'http://domcheloveplanet.ru/')
ORDER BY wid ASC, ip DESC
LIMIT 5;
执行计划输出通常包含两个部分:
逻辑计划部分
Sort: wid ASC NULLS LAST, ip DESC NULLS FIRST, fetch=5
Projection: hits.parquet.WatchID AS wid, hits.parquet.ClientIP AS ip
Filter: starts_with(hits.parquet.URL, Utf8("http://domcheloveplanet.ru/"))
TableScan: hits.parquet projection=[WatchID, ClientIP, URL], partial_filters=[starts_with(hits.parquet.URL, Utf8("http://domcheloveplanet.ru/"))]
物理计划部分
SortPreservingMergeExec: [wid@0 ASC NULLS LAST,ip@1 DESC], fetch=5
SortExec: TopK(fetch=5), expr=[wid@0 ASC NULLS LAST,ip@1 DESC], preserve_partitioning=[true]
ProjectionExec: expr=[WatchID@0 as wid, ClientIP@1 as ip]
CoalesceBatchesExec: target_batch_size=8192
FilterExec: starts_with(URL@2, http://domcheloveplanet.ru/)
DataSourceExec: file_groups={16 groups: [[hits.parquet:0..923748528], ...]}, projection=[WatchID, ClientIP, URL], predicate=starts_with(URL@13, http://domcheloveplanet.ru/), file_type=parquet
执行计划树结构解析
执行计划实际上是一个倒置的树形结构,我们需要从下往上阅读:
- DataSourceExec:从 Parquet 文件中并行读取数据(使用16个核心)
- FilterExec:应用过滤条件
starts_with(URL, 'http://domcheloveplanet.ru/')
- CoalesceBatchesExec:将数据合并为更大的批次进行处理
- ProjectionExec:重命名列(WatchID → wid,ClientIP → ip)
- SortExec:按 wid 升序和 ip 降序排序,使用 TopK 优化仅跟踪每个分区的Top 5值
- SortPreservingMergeExec:合并所有分区的排序结果并返回最终的Top 5行
深入理解大型查询计划
面对复杂的查询计划,可以按照以下步骤进行分析:
- 始终从下往上阅读,一次分析一个操作符
- 通过查阅文档理解每个操作符的功能
- 了解操作符的输入数据量和特性
- 理解操作符的输出数据量和特性
高级调试选项
EXPLAIN VERBOSE
当默认的 EXPLAIN
输出不足以展示所有细节时,可以使用 EXPLAIN VERBOSE
查看完整的执行计划,包括所有中间物理计划。
EXPLAIN ANALYZE
EXPLAIN ANALYZE
会实际执行查询并返回带有运行时指标的注释计划:
EXPLAIN ANALYZE SELECT "WatchID" AS wid, "hits.parquet"."ClientIP" AS ip
FROM 'hits.parquet'
WHERE starts_with("URL", 'http://domcheloveplanet.ru/')
ORDER BY wid ASC, ip DESC
LIMIT 5;
输出包含关键指标如:
output_rows
:操作符输出的行数elapsed_compute
:计算耗时bytes_scanned
:扫描的字节数time_elapsed_opening
:文件打开耗时time_elapsed_scanning_total
:总扫描耗时
谓词下推指标
当启用谓词下推时,DataSourceExec
还会提供以下重要指标:
page_index_rows_matched
:通过页面索引过滤的行数page_index_rows_pruned
:被页面索引过滤掉的行数row_groups_matched_bloom_filter
:通过布隆过滤器过滤的行数row_groups_pruned_bloom_filter
:被布隆过滤器过滤掉的行数row_groups_matched_statistics
:通过行组统计过滤的行数row_groups_pruned_statistics
:被行组统计过滤掉的行数
总结
理解 DataFusion 的执行计划是优化查询性能的基础。通过 EXPLAIN
系列命令,开发者可以深入了解查询的执行路径、数据流和性能特征。掌握这些工具和技术,将帮助您构建更高效的查询和数据处理流程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考