Apache Arrow DataFusion 查询执行计划解析指南

Apache Arrow DataFusion 查询执行计划解析指南

arrow-datafusion Apache Arrow DataFusion SQL Query Engine arrow-datafusion 项目地址: https://gitcode.com/gh_mirrors/ar/arrow-datafusion

引言

在数据库和查询引擎领域,理解查询执行计划是性能调优的关键。本文将深入介绍如何解析 Apache Arrow DataFusion 查询引擎生成的执行计划,帮助开发者更好地理解查询执行过程并识别潜在的性能瓶颈。

执行计划基础概念

DataFusion 采用查询计划(query plan)来执行 SQL 查询。要查看查询计划而不实际执行查询,可以在 SQL 查询前添加 EXPLAIN 关键字。

执行计划分为两种类型:

  1. 逻辑计划(Logical Plan):表示不考虑底层数据组织和硬件配置的抽象查询计划
  2. 物理计划(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

执行计划树结构解析

执行计划实际上是一个倒置的树形结构,我们需要从下往上阅读:

  1. DataSourceExec:从 Parquet 文件中并行读取数据(使用16个核心)
  2. FilterExec:应用过滤条件 starts_with(URL, 'http://domcheloveplanet.ru/')
  3. CoalesceBatchesExec:将数据合并为更大的批次进行处理
  4. ProjectionExec:重命名列(WatchID → wid,ClientIP → ip)
  5. SortExec:按 wid 升序和 ip 降序排序,使用 TopK 优化仅跟踪每个分区的Top 5值
  6. SortPreservingMergeExec:合并所有分区的排序结果并返回最终的Top 5行

深入理解大型查询计划

面对复杂的查询计划,可以按照以下步骤进行分析:

  1. 始终从下往上阅读,一次分析一个操作符
  2. 通过查阅文档理解每个操作符的功能
  3. 了解操作符的输入数据量和特性
  4. 理解操作符的输出数据量和特性

高级调试选项

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 系列命令,开发者可以深入了解查询的执行路径、数据流和性能特征。掌握这些工具和技术,将帮助您构建更高效的查询和数据处理流程。

arrow-datafusion Apache Arrow DataFusion SQL Query Engine arrow-datafusion 项目地址: https://gitcode.com/gh_mirrors/ar/arrow-datafusion

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窦恺墩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值