用 EXPLAIN 查看分区查询的执行计划
本文档所使用的示例数据如下:
由上述 EXPLAIN
结果可知,从最末尾的 —TableFullScan_19
算子开始,再返回到根部的 StreamAgg_21
算子的执行过程如下:
- TiDB 成功地识别出只需要访问一个分区 (),并将该信息在
access object
列中注明。 └─TableFullScan_19
算子先对整个分区进行扫描,然后执行└─Selection_20
算子筛选起始日期为2017-06-01 00:00:00.000000
的行。- 之后,
└─Selection_20
算子匹配的行在 Coprocessor 中进行流式聚合,Coprocessor 本身就可以理解聚合函数 。
由上述 EXPLAIN
结果可知:
- TiDB 认为需要访问所有分区
(p2016..pMax)
。这是因为 TiDB 将谓词YEAR(d)= 2017
视为 non-sargable。这个问题并非是 TiDB 特有的。 - 在扫描每个分区时, 算子将筛选出年份不为 2017 的行。
- 在每个分区上会执行流式聚合,以计算匹配的行数。
└─PartitionUnion_21
算子会合并访问每个分区后的结果。