小编von*_*ryz的帖子

增量统计:找出哪些分区已被重新采样

TL;DR:在使用增量统计数据时,是否可以找出哪些分区已重新采样,哪些未重新采样?平台为 SQL Server 2014 企业版。

带有一些背景信息的长版本是这样的。

假设一个相当典型的 DW 环境,有一个分区表。分区基于日期列。这是因为将暂存数据加载到单独的表上,并且在预处理之后,使用分区切换将数据移动到生产事实表中。哦,一个聚集列存储索引正在使用中。使用了大约一千个分区。数据库在虚拟机上运行。

事实表中有大约 7.5 gigarows (100 GB)。每日增长约为 5 兆。这个增长率太小,无法触发自动统计更新,保存跟踪标志 2371(尚未尝试)。

开发人员对过时统计数据的下意识反应是更新它们。对于 7.5 gigarows,所有统计数据的完整更新需要大约五个小时。对于单个统计更新,处理性能约为每秒 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 会很好,但没有,是吗?

sql-server statistics dmv partitioning sql-server-2014

4
推荐指数
1
解决办法
947
查看次数