可以向TiDB开发提需求,对动态SQL学习Oracle 的自适应游标共享(Adaptive Cursor Sharing 以后简称ACS)功能,使包含绑定变量的同一条SQL(动态SQL)语句在多次执行时,不会盲目的共享执行计划,而会根据绑定变量值和执行过程中收集信息的反馈,可以使用多个不同执行计划,避免性能问题。
还有SPM固定执行计划,绑定执行计划后,会以此执行计划作为基线,当sql的执行计划产生变更,如果我们验证了变更的执行计划效率高于基线,那么才会启用此执行计划。
看场景吧,绑定执行计划更灵活
- Hints:Hints 是一种直接在 SQL 查询语句中指定执行计划的方式。你可以使用 Hints 来提示优化器选择特定的执行计划。Hints 的优点是灵活性高,可以按需调整执行计划,适用于临时或特殊情况下需要干预执行计划的场景。但是,使用 Hints 需要手动编写和维护,容易出现人为错误,且可能不利于代码的可读性和维护性。
- 执行计划绑定(Plan Binding):执行计划绑定是一种将查询语句与特定的执行计划关联起来的方式。通过执行计划绑定,可以确保查询语句每次运行时都使用相同的执行计划。执行计划绑定可以提高查询的稳定性和一致性,并减少执行计划的选择开销。适用于对关键查询有稳定性和性能要求的场景。但是,执行计划绑定需要事先收集和管理执行计划,并可能需要针对不同的参数值创建多个执行计划,因此对于多样化的查询场景,绑定过多的执行计划可能会增加管理工作量。
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就是为了在内存中快速加工和计算,落盘速度就慢了。
Oracle也没那么靠谱,我在11g上,一个表主键是(AAA,BBB) , select * from 表 where AAA,BBB执行计划都出错过
一般是业务来适用执行计划。
应急就绑,不应急代码加。绑了的库还需要注意备份的情况。老版的dumpling就没有备份绑定执行计划的表,新版不知道有没有改进
最最上乘的办法就是通过统计信息来解决,但是这也是最难的。
统计信息解决不了的,才分两种情况。如果是出故障的就去绑定,没有出故障的就应用自己去解决。
这个是个什么情况?如何判断分析的
通过explain verbose=‘format’ 实际对比了两种执行计划,发现实际走的是estCost更高的执行计划
统计信息没有过期的
不建议绑定执行计划
统计信息没有过期是什么问题呢 ? SQL发出来看看呢。