范围:以 10 种方式索引的十亿记录表。每天的变化率为百分之一。
一些索引单调递增(日期时间/时间戳),但常见查询很可能到达尾部。我假设这种类型的统计数据需要经常更新,否则最近的数据会在索引中消失?
其他索引的分布更为随机,例如(客户密钥、日期时间)。这些可以通过不太频繁的更新来实现,因为统计数据非常能代表整体。我们可以让索引的变化足以强制对这些进行自动统计更新,对吗?
对于这两种类型,如果要抽样的数据是随机的并且非常能代表整体,那么将抽样从 10% 增加到 100% 有什么好处吗?
寻找结核病数据的最佳实践。
如果你总是查询尾部,你可以试试过滤索引。索引 10 种方式,比如
WHERE datetimecolumn > @INDEXBUILDDAY-30
. 定期(每天,每周?)您可以通过添加(在线)一组新的过滤索引然后删除旧索引来向前移动此过滤器。有了更小的尺寸和更新的构建(暗示最近的统计数据),它们将是“新鲜的”并且非常适合优化器。定期重建甚至不需要扫描基表(没有巨大的 IO,没有 BP 缓存污染),旧的过滤索引应该始终可用作构建下一个过滤索引的源(它覆盖它)。对于那些落在覆盖过滤尾部之外的查询,您可以保留一些(希望少于 10 种方式)完整的、未过滤的索引。通过正确的巫术调用,优化器可能会明白你的意思,并在适当的时候使用过滤后的,只在必要时才求助于完整的......
有几个跟踪标志可以帮助统计升序键、TF2389 和 TF2390。
自 2005SP1 以来,SQL Server 识别并“标记”了升序键。如果设置了 TF2389 并且覆盖索引的前导列被标记,则该列的统计信息将通过识别最高键值并更新现有直方图来自动更新。启用 TF2930 会导致在列未被识别(标记)为升序的情况下发生相同的更新。
请记住,统计信息更新发生在查询编译期间,因此如果重新编译很少见,您可能需要在某些过程或查询上测试 RECOMPILE 提示以强制更新。或者,如果编译成本很高,则对过程定期执行 sp_recompile 可能会有所帮助。
Statistics on Ascending Columns是一篇涵盖机制的好文章。
注意:使用跟踪标志的通常注意事项适用......测试,测试和测试更多。