标准答案
- ANALYZE 通过采样更新列统计,自动 analyze 由表规模和变更量触发;大表统计并不一定包含所有值,因此要理解估算误差的来源。
- 数据高度倾斜、列之间相关性强或值分布变化很快时,可以按列提高 statistics target,必要时使用扩展统计信息表达多列关系。
- 估算 rows 与 actual rows 长期偏差是重要证据,但还要排除参数敏感、临时表统计缺失、查询执行期间数据变化和计划缓存影响。
- 修复后要比较计划、P95/P99、缓冲、临时文件、CPU 和 I/O;计划文本改变不等于性能和稳定性一定变好。
- 统计更新本身也会消耗资源,不能在高峰期无边界地提高全局目标;应优先处理真正影响核心查询的列。
题目解析
规划器并不知道业务语义,只能依据统计信息估算“会返回多少行、哪种路径成本更低”。当两个字段强相关而统计没有表达这种关系时,估算可能偏离实际很多。
错误计划的修复顺序通常是先确认统计是否过期,再判断是否需要提高目标或增加扩展统计;如果访问模式本身不合理,仍需改 SQL 或索引。
面试中应把“统计不准”与“索引不存在”区分开:同一个索引在估算准确时可能被使用,在估算错误时可能被放弃。
常见误区
- 误区:只提高全局 statistics target。改正:先定位受影响的列和查询,按列或扩展统计调整并观察采样成本。
- 误区:每次慢 SQL 都手工 ANALYZE。改正:先看数据变更、自动 analyze、临时表和参数分布,避免把一次性操作当长期治理。
- 误区:认为估算行数偏差只能靠加索引解决。改正:统计、相关性、SQL 形状和数据分布都可能是根因。