咨询一个问题表的统计信息问题。

tidb_enable_pseudo_for_outdated_stats 从 v5.3.0 版本开始引入

  • 作用域:SESSION | GLOBAL
  • 是否持久化到集群:是
  • 是否受 Hint SET_VAR 控制:是
  • 类型:布尔型
  • 默认值:OFF
  • 这个变量用来控制优化器在一张表上的统计信息过期时的行为。
  • 统计信息过期的判断标准:最近一次对某张表执行 ANALYZE 获得统计信息后,该表数据被修改的行数大于该表总行数的 80%,便可判定该表的统计信息已过期。该比例可通过 pseudo-estimate-ratio 配置参数调整。
  • 默认情况下(即该变量值为 OFF 时),某张表上的统计信息过期后,优化器仍会使用该表上的统计信息。将该变量值设为 ON 时,当统计信息过期后,优化器认为该表上除总行数以外的统计信息不再可靠,转而使用 pseudo 统计信息。
  • 如果表数据修改较频繁,没有及时对表执行 ANALYZE,但又希望执行计划保持稳定,推荐将该变量值设为 OFF

如果设置为off 会不会影响统计sql的执行的准确性。本来快的变慢了

有tidb_auto_analyze_ratio参数,应该用不到

建议设置成off,能保持执行计划的稳定,如果设置成 on,统计信息过期后使用 10000 行来评估,容易出现执行计划走错。

设置成OFF的话就是默认用你原来的执行计划,ON的话就是用pseudo统计信息,感觉OFF更合理一点。

建议off

是不是可以这么理解,设置为OFF时,不管统计信息对不对,都按统计信息走,俗称凭着经验,跟着感觉走? :thinking:

建议off

有这个可能性,主要还是看你的表数据量和数据分布变化,如果是数据量和分布变化大的话,有可能会选择错误的执行计划