TL;DR:当使用增量统计时,是否有可能找出哪些分区已经被重新采样,哪些没有?平台是 SQL Server 2014 企业版。
带有一些背景信息的长版本是这样的。
假设一个相当典型的 DW 环境,有一个分区表。分区基于日期列。这是通过将暂存数据加载到单独的表中并在预处理之后使用分区切换将数据移动到生产事实表中来完成的。哦,正在使用聚集列存储索引。使用了大约一千个分区。数据库在虚拟机上运行。
事实表中有大约 7.5 千兆行 (100 GB)。每日增长约五兆行。这是一个太小的增长率,无法触发自动统计更新,保存跟踪标志 2371(尚未尝试)。
开发人员对过时统计数据的本能反应是更新它们。对于 7.5 千兆行,所有统计数据的完整更新需要大约五个小时。对于单个统计更新,处理性能约为 20 分钟或每秒 90 兆行。
由于系统在 VM 平台上,业务规则限制了它的成本。内存和 IOPS 都不容易增加。五小时的更新工作太慢了,无法包含在每晚的 ETL 过程中,因此统计信息要么过时,要么在意外时间更新,要么将在维护窗口中更新。
由于SQL Server是2014企业版,所以支持增量统计,听起来就是解决方案。将统计数据转换为增量统计数据后,处理单个分区的单个统计数据仅需 20 秒。新切换分区的总计约为五分钟。这听起来不错,当然适合 ETL 过程。
我想知道的是如何在分区切换环境中管理增量统计信息。假设统计数据在日期 D 被转换和更新为增量,那么如何找出日期 D+2 的未处理分区?在 ETL 过程中更新统计信息是微不足道的,因为切换过程显然知道分区 ID。但是如果有没有重新采样的分区,如何找到它们呢?
- 统计数据的最新更新可以从
sys.dm_db_stats_properties
- 分区号可从
sys.partitions
- 分区函数值在
sys.partition_range_values
可以选择统计的最后更新日期 L 并将其与今天的日期 T 进行比较。然后计算 L 指向哪个分区 ID 以及它是否与 T 相同。然后继续更新所有分区 ID [L, T)。这听起来很棘手而且容易出错,那么有没有更好的方法呢?显示哪些分区用于重采样的 DMV 会很好,但没有一个,是吗?
我的第一个问题是问您为什么实际上首先使用增量。这是我发布的关于增量统计的答案,Erin Stellato 的一篇博客文章,阐明了增量统计的主要抱怨和陷阱之一(优化器不在分区级别使用它们),以及我的两篇 博客文章通过评估增量统计的任何潜在用例来工作。
话虽如此,要知道分区的统计数据何时被采样,您可以使用未记录的 DMF (
sys.dm_db_stats_properties_internal()
) 来获取分区级信息。我对这篇博文有评论,它描述了如何在相当高的层次上理解层次结构。