我试图了解统计抽样的工作原理以及以下是否是抽样统计更新的预期行为。
我们有一个按日期分区的大表,有几十亿行。分区日期是之前的营业日期,因此是一个升序键。我们只将前一天的数据加载到该表中。
数据加载整夜运行,因此我们在 4 月 8 日星期五加载了 7 日的数据。
每次运行后,我们都会更新统计数据,但会抽取一个样本,而不是FULLSCAN
.
也许我太天真了,但我希望 SQL Server 识别范围内的最高键和最低键,以确保它获得准确的范围样本。根据这篇文章:
对于第一个桶,下边界是生成直方图的列的最小值。
但是,它没有提到最后一个桶/最大值。
随着 8 日上午的采样统计更新,样本错过了表中的最高值(7 日)。
由于我们对前一天的数据进行了大量查询,这导致了不准确的基数估计和许多查询超时。
SQL Server 是否应该不识别该键的最高值并将其用作最大值RANGE_HI_KEY
?或者这只是不使用更新的限制之一FULLSCAN
?
版本 SQL Server 2012 SP2-CU7。我们目前无法升级,因为OPENQUERY
SP3 中的行为发生了变化,即在 SQL Server 和 Oracle 之间的链接服务器查询中舍入数字。
这是当前抽样统计信息实施的局限性。就目前而言,抽样统计信息收集使用
TABLESAMPLE SYSTEM
,它使用分配顺序扫描并从扫描中选择页面进行抽样。只有选定的页面才有助于直方图。由于扫描是按分配顺序(而不是按索引顺序)的,因此无法按关键字顺序优先选择第一页和最后一页。
有关更多信息,请参阅此相关问题:
更新统计数据时抽样如何工作?
和我的文章,分配顺序扫描
有关变通方法,请参阅Fabiano Amorim 撰写的关于升序列的统计信息
快速猜测:启用跟踪标志 4139。
您已经在运行SP2-CU1,所以这应该可以工作
也请注意有关 TF 2389 广告 2390 的准则,另请参阅http://sql-sasquatch.blogspot.com.mt/2013/06/mssql-plan-guides-to-address-ascending.html
(注意,我并没有真正遇到这个问题,也没有深入研究过)