SQL中修改直方图分箱数及统计信息采样、调用相关问题咨询
SQL Server统计信息与直方图常见问题解答
是否可以修改直方图的分箱数量
SQL Server的直方图默认最多支持200个分箱,不支持用户手动修改分箱数量,分箱逻辑由数据库引擎自动优化生成,无法通过配置项或语法强制指定分箱数。
如何调整直方图生成的采样行数
创建或更新统计信息时,通过SAMPLE参数指定采样比例或行数即可,语法示例:
-- 按百分比采样 CREATE STATISTICS [统计信息名] ON [表名]([字段名]) WITH SAMPLE 百分比 PERCENT; -- 按指定行数采样 UPDATE STATISTICS [表名] [统计信息名] WITH SAMPLE 行数 ROWS; -- 全表扫描生成统计信息 UPDATE STATISTICS [表名] [统计信息名] WITH FULLSCAN;
如何查看统计信息的采样行数,以及采样行数不符合预期的原因
查看采样行数的方法
执行DBCC SHOW_STATISTICS命令即可,返回结果的第一个结果集中的Rows Sampled字段就是生成统计信息时的实际采样行数。
采样行数不符合预期的原因
当表的总行数较小,或者指定的采样比例对应的采样行数达到了引擎的阈值时,SQL Server会自动将采样升级为全表扫描,避免小样本带来的统计信息不准、执行计划劣化问题。
测试的表总行数为40000,1%采样仅对应400行,引擎判定全表扫描的成本更低、统计信息准确性更高,因此自动使用了全表扫描生成统计信息,所以Rows Sampled字段显示为40000。
如果需要强制使用指定的采样比例,可以在创建/更新统计信息时添加PERSIST_SAMPLE_PERCENT = ON参数:
CREATE STATISTICS Customer_Lastname ON dbo.Customer (LastName) WITH SAMPLE 1 PERCENT, PERSIST_SAMPLE_PERCENT = ON;
如何强制SQL使用已创建的指定统计信息
SQL Server没有直接的语法可以强制查询使用某一个指定的统计信息,通常可以通过以下两种方式实现类似效果:
- 调整统计信息的采样精度为全表扫描,确保统计信息足够准确,引擎会自动选择最优的统计信息生成执行计划
- 若确实需要固定执行逻辑,可通过查询存储功能固定符合预期的执行计划,或者使用
USE HINT等查询提示调整基数评估逻辑
注意:强制干预统计信息的选择属于高风险操作,会覆盖数据库引擎的自动优化逻辑,非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者liana
相关产品推荐
相关产品推荐

