采样率直接影响统计准确性与执行计划质量:过低致失真引发索引误用,过高增开销而收益递减;SQL Server/PostgreSQL依采样构建直方图,倾斜列尤需高采样,100%适合关键枚举字段,5%–30%为常用平衡区间,AUTO则需定期验证。

索引统计信息的采样率直接影响查询优化器对数据分布的判断,进而决定执行计划是否高效。采样率过低会导致统计失真,引发索引误用或全表扫描;过高则增加统计更新开销,且收益边际递减。
采样率如何影响统计准确性
SQL Server 和 PostgreSQL 等数据库在构建列直方图和密度向量时,依赖抽样数据估算值频次、范围分布和唯一性。默认采样(如 SQL Server 的 AUTO 选项)通常按数据量动态调整:小表全采,大表可能仅采 1%–20%。若某列存在倾斜分布(例如 95% 值为 'active',其余分散),低采样率极易漏掉稀有值或低估高频值跨度,导致优化器误判选择性,放弃本该使用的索引。
常见采样率设置与适用场景
- 100%(FULLSCAN):适合核心业务表中分布极不均匀、且查询高度依赖该列过滤的场景,如用户状态、订单类型等枚举字段;但会阻塞DML并显著延长 UPDATE STATISTICS 时间。
- 5%–30%(SAMPLE):平衡准确性和开销的常用区间;对千万级以下表较稳妥;需结合直方图步数(STEPS)观察——即使采样率够,步数不足(如默认200步)仍会合并相邻桶,掩盖局部峰值。
- 系统自动(WITH AUTO):依赖数据库内置启发式算法,适合常规OLTP表;但在分区表、列存表或频繁写入场景下可能持续欠采样,需定期验证统计质量。
如何判断当前采样是否足够
不依赖猜测,直接查元数据:
- SQL Server:查询 sys.dm_db_stats_histogram 中 actual_number_of_rows 与 average_range_rows 的偏差,对比 sys.stats 的 rows_sampled / rows 比值;若采样率<5% 且直方图中最大 step 覆盖行数远超平均值,说明存在严重倾斜未被捕捉。
- PostgreSQL:检查 pg_statistic 中 stanullfrac、stakind1 对应的 stavalues1 和 stanumbers1,结合 pg_class.reltuples 推算采样比例;再用 EXPLAIN (ANALYZE) 观察实际行数 vs 预估行数差异是否持续>3倍。
优化建议与实操注意点
- 对高频查询的 WHERE / JOIN / ORDER BY 列,优先手动指定采样率(如 SAMPLE 30 PERCENT),而非依赖 AUTO。
- 避免在业务高峰期运行 FULLSCAN;可结合 NORECOMPUTE + 定时作业,在低峰期按需更新关键统计。
- 分区表要确认是否启用 INCREMENTAL 统计(SQL Server 2014+),否则全局采样会忽略分区边界特性,导致跨分区查询计划劣化。
- 更新统计后,留意执行计划是否刷新——部分缓存计划不会自动重编译,必要时加 OPTION (RECOMPILE) 或清空过程缓存。










