在 TiDB 7.1 版本中推出了一个新的变量 tidb_opt_fix_control
,该变量可以用来控制优化器的一些内部行为。通过设置该变量,可以更细粒度地控制优化器的行为,并且避免集群升级后优化器行为变化导致的性能回退。我们来看看这个参数带来的改变吧。感兴趣的可以查看一下官方文档。https://docs.pingcap.com/zh/tidb/dev/system-variables
设置方式比较简单:set @@tidb_opt_fix_control = "44262:ON"
在 session.go 中现在增加了一个函数
// GetOptimizerFixControlValue returns the specified value of the optimizer fix control.
func (s *SessionVars) GetOptimizerFixControlValue(key uint64) (value string, exist bool) {
if s.OptimizerFixControl == nil {
return "", false
}
value, exist = s.OptimizerFixControl[key]
return
}
通过这个函数获取设置的 fix control 值,然后在优化器的逻辑优化阶段,比如某个逻辑优化场景,就会进行判断和使用。
fixValue, ok := b.ctx.GetSessionVars().GetOptimizerFixControlValue(variable.TiDBOptFixControl44262)
if ok && variable.TiDBOptOn(fixValue) {
allowDynamicWithoutStats = true
}
// If dynamic partition prune isn't enabled or global stats is not ready, we won't enable dynamic prune mode in query
usePartitionProcessor := !isDynamicEnabled || (!globalStatsReady && !allowDynamicWithoutStats)
从最新的 master 代码中,可以看到有一段代码已经用上了。这段代码获取了的是一个常量值TiDBOptFixControl44262。
var (
// variables below are for the optimizer fix control.
// TiDBOptFixControl44262 controls whether to allow to use dynamic-mode to access partitioning tables without global-stats (#44262).
TiDBOptFixControl44262 uint64 = 44262
)
这里常量定义的是44262 这个 issue。这个 issue 可以在 github 上找到相关的说明。这是一个分区表动态裁剪需要 global stats 的问题修复。

具体现在可以使用哪些 fix_control ,可以打开关闭哪些功能,可以多关注一下 github 上的 issue 列表,有新的 fix_control 可以一同探讨一下。
文章转载自TiDB之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




