TiDB控制执行计划有没有好的建议?是使用Hints更好还是通过执行计划绑定更好?

可以向TiDB开发提需求,对动态SQL学习Oracle 的自适应游标共享(Adaptive Cursor Sharing 以后简称ACS)功能,使包含绑定变量的同一条SQL(动态SQL)语句在多次执行时,不会盲目的共享执行计划,而会根据绑定变量值和执行过程中收集信息的反馈,可以使用多个不同执行计划,避免性能问题。
还有SPM固定执行计划,绑定执行计划后,会以此执行计划作为基线,当sql的执行计划产生变更,如果我们验证了变更的执行计划效率高于基线,那么才会启用此执行计划。

看场景吧,绑定执行计划更灵活

  1. Hints:Hints 是一种直接在 SQL 查询语句中指定执行计划的方式。你可以使用 Hints 来提示优化器选择特定的执行计划。Hints 的优点是灵活性高,可以按需调整执行计划,适用于临时或特殊情况下需要干预执行计划的场景。但是,使用 Hints 需要手动编写和维护,容易出现人为错误,且可能不利于代码的可读性和维护性。
  2. 执行计划绑定(Plan Binding):执行计划绑定是一种将查询语句与特定的执行计划关联起来的方式。通过执行计划绑定,可以确保查询语句每次运行时都使用相同的执行计划。执行计划绑定可以提高查询的稳定性和一致性,并减少执行计划的选择开销。适用于对关键查询有稳定性和性能要求的场景。但是,执行计划绑定需要事先收集和管理执行计划,并可能需要针对不同的参数值创建多个执行计划,因此对于多样化的查询场景,绑定过多的执行计划可能会增加管理工作量。
1 个赞

1、对于批量分析的SQL,我们在上线之前涉及的全部源表都会创建TiFlash副本,并且都会检查实际执行计划是否全部走TiFlash MPP;
2、TiFlash本身就是在内存里计算,不涉及落盘吧?
3、7.5还是比较期待,目前比较新,目前离落地升级还是有一段时间。

就目前而言,两种方式都很难维护,都挺痛苦

这个有点像目前TiDB的自动演进绑定,但是目前这个功能还不够完善,并且处于实验特性。

因为我这边是开发,所以偏向使用hints。

https://docs.pingcap.com/zh/tidb/stable/tiflash-spill-disk#查询级别的落盘

7.0只能设置3种算子单独触发算子落盘的内存大小。
7.4开始支持查询级别的落盘,这个使用起来会比较友好。

不好维护

确实如此,两者都不好维护,但是有时又不得不做。

目前我们TiFlash倒不倾向于落盘,因为本身用TiFlash就是为了在内存中快速加工和计算,落盘速度就慢了。

1 个赞

Oracle也没那么靠谱,我在11g上,一个表主键是(AAA,BBB) , select * from 表 where AAA,BBB执行计划都出错过

一般是业务来适用执行计划。

应急就绑,不应急代码加。绑了的库还需要注意备份的情况。老版的dumpling就没有备份绑定执行计划的表,新版不知道有没有改进

最最上乘的办法就是通过统计信息来解决,但是这也是最难的。
统计信息解决不了的,才分两种情况。如果是出故障的就去绑定,没有出故障的就应用自己去解决。

这个是个什么情况?如何判断分析的

通过explain verbose=‘format’ 实际对比了两种执行计划,发现实际走的是estCost更高的执行计划

统计信息没有过期的

不建议绑定执行计划

统计信息没有过期是什么问题呢 ? SQL发出来看看呢。