用 EXPLAIN 查看 SQL 语句需要访问的分区

    本文档所使用的示例数据如下:

    由上述 EXPLAIN 结果可知,从最末尾的 —TableFullScan_19 算子开始,再返回到根部的 StreamAgg_21 算子的执行过程如下:

    • TiDB 成功地识别出只需要访问一个分区(),并将该信息在 access object 列中注明。
    • └─TableFullScan_19 算子先对整个分区进行扫描,然后执行 └─Selection_20 算子筛选起始日期为 2017-06-01 00:00:00.000000 的行。
    • 每个 Coprocessor 请求会发送一行数据给 TiDB 的 └─TableReader_22 算子,然后将数据在 StreamAgg_21 算子下进行流式聚合,再将一行数据返回给客户端。

    由上述 EXPLAIN 结果可知:

    • TiDB 认为需要访问所有分区 (p2016..pMax)。这是因为 TiDB 将谓词 YEAR(d)= 2017 视为 。这个问题并非是 TiDB 特有的。
    • 在每个分区上会执行流式聚合,以计算匹配的行数。
    • └─PartitionUnion_21 算子会合并访问每个分区后的结果。