TiFlash无法下推日期函数吗?

【 TiDB 使用环境】生产环境
【 TiDB 版本】v5.0.4, 相关表已开启TiFlash并启用MPP模式
【遇到的问题】
执行SQL:

explain select DATE_FORMAT(CREATED_AT,'%Y-%m') as ORDER_MONTH, count(1) FROM tbl_order GROUP BY ORDER_MONTH;

得到的执行计划如下:

Projection_4, 66101793.52, root, , date_format(tbl_order.created_at, %Y-%m)->Column#54, Column#53
└─TableReader_27, 66101793.52, root, , data:ExchangeSender_26
  └─ExchangeSender_26, 66101793.52, batchCop[tiflash], , ExchangeType: PassThrough
    └─Projection_22, 66101793.52, batchCop[tiflash], , Column#53, tbl_order.created_at
      └─HashAgg_23, 66101793.52, batchCop[tiflash], , group by:Column#59, funcs:sum(Column#60)->Column#53, funcs:firstrow(Column#61)->tbl_order.created_at
        └─ExchangeReceiver_25, 66101793.52, batchCop[tiflash], , 
          └─ExchangeSender_24, 66101793.52, batchCop[tiflash], , ExchangeType: HashPartition, Hash Cols: Column#59
            └─HashAgg_8, 66101793.52, batchCop[tiflash], , group by:Column#66, funcs:count(1)->Column#60, funcs:firstrow(Column#65)->Column#61
              └─Projection_31, 177472581.00, batchCop[tiflash], , tbl_order.created_at, date_format(tbl_order.created_at, %Y-%m)->Column#66
                └─TableFullScan_21, 177472581.00, batchCop[tiflash], table:tbl_order, keep order:false

只统计一两年的每月汇总数据, 返回TiDB Server结果集行数应该在几十行, 但现在在TiDB Server上还会处理66101793.52行.

【复现路径】
【问题现象及影响】 TiDB Server处理行数较多, 与预期不符.


若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

我看文档中说是支持DATE_FORMAT的

https://docs.pingcap.com/zh/tidb/stable/use-tiflash#tiflash-支持的计算下推

1 个赞

date_format函数在5.0版本中是支持下推计算的。
你可以看看tbl_order表的健康度是多少,可能是因为健康度不高,导致执行计划中的返回条数预估错误。
或者你可以真实执行该sql语句,看看实际执行计划是什么

2 个赞

感谢解答, 确实是实际返回条数和预估差距比较大.
EXPLAIN ANALYZE看到实际返回TiDB Server的结果只有几十行, 符合预期.

但是用SHOW STATS_HEALTHY查看该表健康度为98, 似乎比较正常?

estRows是算子预计将会输出的数据条数,基于统计信息以及算子的执行逻辑估算而来。
至于为什么健康度高,但是预估结果差距较大,我也不太清楚了,可以开个帖子等大佬回答

1 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。