SQL Server 示例统计更新在升序键列上遗漏了最高的 RANGE_HI_KEY

Mar*_*son 12 sql-server statistics sql-server-2012

我试图了解统计抽样是如何工作的,以及以下是否是抽样统计更新的预期行为。

我们有一个按日期分区的大表,有几十亿行。分区日期是先前的营业日期,因此是升序键。我们只将前一天的数据加载到该表中。

数据加载在夜间运行,因此在 4 月 8 日星期五,我们加载了 7 日的数据。

每次运行后,我们都会更新统计信息,尽管采取了一个样本,而不是一个FULLSCAN.

也许我太天真了,但我希望 SQL Server 识别范围中的最高键和最低键,以确保它获得准确的范围样本。根据这篇文章

对于第一个桶,下边界是生成直方图的列的最小值。

但是,它没有提到最后一个桶/最大值。

随着8日上午的抽样统计更新,该样本错过了表中的最高值(7日)。

在此处输入图片说明

由于我们对前一天的数据进行了大量查询,这会导致基数估计不准确和许多查询超时。

SQL Server 不应该识别该键的最高值并将其用作最大值RANGE_HI_KEY吗?或者这只是不使用更新的限制之一FULLSCAN

版本 SQL Server 2012 SP2-CU7。我们目前无法升级,因为OPENQUERYSP3中的行为改变了SQL Server 和 Oracle 之间的链接服务器查询中的数字四舍五入。

Pau*_*ite 12

SQL Server 不应该识别该键的最高值并将其用作最大值RANGE_HI_KEY吗?或者这只是不使用更新的限制之一FULLSCAN

这是采样统计当前实现的一个限制。就目前而言,抽样统计收集使用TABLESAMPLE SYSTEM,它使用分配顺序扫描并从扫描中选择页面以进行抽样。只有选定的页面对直方图有贡献。

由于扫描是按分配顺序进行的(而不是按索引顺序进行的),因此无法按键顺序优先考虑第一页和最后一页。

有关更多信息,请参阅此相关问题:

更新统计信息时抽样如何工作?

和我的文章,分配订单扫描

对于解决方法,请统计上升序列法比亚诺阿莫林