【 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语句执行的,默认情况下,都是不同的执行计划。
5 个赞
“即使是Prepare语句也要打开执行计划缓存,才会跳过执行计划的生成。”
只要进行了生成 执行计划,那么就会产生新的执行计划id吗?
id它就应该是标识唯一实例的。
如果重复生成,哪怕内容相同,也应该是不同的id。
毕竟执行计划再小也有内存占用。
1 个赞
一百分
1 个赞
啥原因,等结果
这是不是和Oracle有点儿像,不太清楚,等大佬来回答。
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。