同一个sql指纹, 产生了不同的执行计划id,但计划内容又一样!为什么?

【 TiDB 使用环境】生产环境
【 TiDB 版本】
【复现路径】TiDB Dashboard -》sql语句分析, 根据执行计划数排序
【问题】 发现同一个sql指纹下,出现多个不同的执行计划。查看计划详细信息,发现执行计划相同(使用了同一个索引,同一种算子)可为什么还是产生了不同的执行计划呢?



https://docs.pingcap.com/zh/tidb/stable/sql-prepared-plan-cache

即使是Prepare语句也要打开执行计划缓存,才会跳过执行计划的生成。
里面还有一堆会导致执行计划缓存失效的情况。可以自行阅读。

LRU 链表是设计成 session 级别的缓存,因为 Prepare /Execute 不能跨 session 执行。

而且当前tidb的执行计划缓存是session级的,所以两个session即使用Prepare语句执行同一个sql,开了缓存,仍然是2个计划。

而非Prepare语句的执行计划缓存,

https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_enable_non_prepared_plan_cache

默认是关闭的。所以如果你甚至不是通过Prepare语句执行的,默认情况下,都是不同的执行计划。

4 个赞

“即使是Prepare语句也要打开执行计划缓存,才会跳过执行计划的生成。”
只要进行了生成 执行计划,那么就会产生新的执行计划id吗?

id它就应该是标识唯一实例的。
如果重复生成,哪怕内容相同,也应该是不同的id。
毕竟执行计划再小也有内存占用。

1 个赞

一百分

:yum: :+1: :+1: :+1:

啥原因,等结果

这是不是和Oracle有点儿像,不太清楚,等大佬来回答。