SQL Server示例统计信息更新在升序键列上错过最高的RANGE_HI_KEY


10

我正在尝试了解统计信息采样的工作原理,以及以下是否是采样统计信息更新的预期行为。

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

数据加载会在一夜之间进行,因此在4月8日(星期五),我们加载了7月7日的数据。

每次运行后,我们都会更新统计信息,尽管需要抽样,而不是FULLSCAN

也许我很天真,但我希望SQL Server能够确定范围内的最高键和最低键,以确保获得准确的范围样本。根据这篇文章

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

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

由于采样的统计信息是在8日上午更新的,因此该样本未达到表格(第7位)中的最高值。

在此处输入图片说明

由于我们对前一天的数据进行了很多查询,因此导致基数估计不准确,并且许多查询超时。

SQL Server是否应该不标识该键的最大值并将其用作最大值RANGE_HI_KEY?还是这仅仅是不使用更新的限制之一FULLSCAN

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

Answers:


11

SQL Server是否应该不标识该键的最大值并将其用作最大值RANGE_HI_KEY?还是这仅仅是不使用更新的限制之一FULLSCAN

这是当前采样统计实现的局限性。就目前而言,抽样统计信息收集使用TABLESAMPLE SYSTEM,它使用分配顺序扫描并从扫描中选择要抽样的页面。仅所选页面有助于直方图。

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

有关更多信息,请参见以下相关问题:

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

和我的文章“ 分配顺序扫描”

有关解决方法,请参阅Fabiano Amorim的“ 递增列统计信息”


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.