如何确保 change_tracking 统计信息保持更新

Dan*_*vey 6 sql-server change-tracking sql-server-2016

我在 Windows Server 2012 R2 Standard 6.3 上使用 Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64) Jun 15 2019 23:15:58 版权所有 (c) Microsoft Corporation 标准版(64 位) (Build 9600

:) 我有多个数据库,在高插入/更新表上启用了 CHANGE_TRACKING。我的保留期是 2 天,启用了自动清理。数据库兼容性设置为 130 (SQL 2016)

更改跟踪配置

跟踪的一些表很大,每天可能有数千次插入/更新。这是change_tracking 表的内容。

更改跟踪表

这是我们为获取更改而执行的查询示例。

SELECT Columns
FROM CHANGETABLE(CHANGES MyTable, @TrackingKey) AS CT 
INNER JOIN MyTable b ON b.Key=CT.Key
WHERE b.Status = 1
Run Code Online (Sandbox Code Playgroud)

我不时看到在某些表上获取最新更改的查询需要很长时间才能完成并生成大量 CPU。为了解决这个问题,我在每晚运行的更改跟踪表上设置了每日更新统计信息。它有很大帮助,但有时,在用户活动频繁的日子里,即使在白天,我也必须运行此更新统计信息。当我在这些表上运行更新统计信息时,情况恢复正常,获取最新更改的查询可以正常运行一段时间。

我们对应用程序的一些重要部分使用更改跟踪,因此它必须起作用。

是否有任何选项,我可以启用跟踪标志来帮助更改跟踪统计信息?任何对高活动数据库进行更改跟踪的人都可以给我一些建议吗?


所以我最终决定做一个工作来检查自上次统计更新以来更改跟踪表是否更改了超过 20k 行,然后该作业将更新更改跟踪表上的统计信息。

如果它可以帮助其他人,我会将查询放在这里。此查询为您提供更改跟踪表的所有统计信息,其中该表自上次更新统计信息以来更改了 2 万次以上。它为您提供了一个带有要更新的 object_name 的“更新统计信息”。您只需要在您的数据库上运行查询的结果。我会根据我的工作量对其进行微调,看看 20k 是否是最好的数字。

SELECT 
 -- st.object_id                          AS [Table ID]
 --, OBJECT_NAME(st.object_id)             AS [Table Name]
 --, st.name                               AS [Index Name]
 --, STATS_DATE(st.object_id, st.stats_id) AS [LastUpdated]
 --, modification_counter                  AS [Rows Modified]
'UPDATE STATISTICS sys.[' + OBJECT_NAME(st.object_id) + ']' as QueryToRun
FROM sys.stats st 
CROSS APPLY sys.dm_db_stats_properties(st.object_id, st.stats_id) AS sp 
WHERE OBJECT_NAME(st.object_id) like 'change_t%'
AND OBJECT_NAME(st.object_id) in (SELECT  'change_tracking_' + convert(nvarchar(50),st.object_id) FROM sys.change_tracking_tables ctt inner join sys.tables st ON st.object_id = ctt.object_id inner join sys.schemas ss ON ss.schema_id = st.schema_id)
AND modification_counter > 20000 
Run Code Online (Sandbox Code Playgroud)

Kin*_*hah 4

由于您使用的是具有 DB 兼容模式的 SQL Server 2016,因此TF 2371 的行为是默认行为

您不再需要在 SQL Server 2016 或更高版本中启用跟踪标志 2371,因为默认情况下会启用相应的行为。

您应该启用auto update async数据库选项,以便当 sql server 更新统计信息时,它不会影响您的工作负载。更改此数据库选项是在线操作。

您可以做的是利用sys.dm_db_stats_properties新的 DMV 来决定是否必须手动更新表的统计信息。您可以将 SQL 代理作业配置为每 x 分钟或每小时检查和更新某些关键表的统计信息。

  • 布伦特不建议将其设置为“关闭”作为一揽子规则 - “我们建议将其设置回默认值(禁用),除非您有证据表明统计数据更新导致的延迟给您带来了问题。”。我目前已启用此选项,它对我们有很大帮助。这基本上以异步方式启动更新统计信息,这对于易失性表来说是有益的。与往常一样,在非生产环境中对此进行测试。 (2认同)