如何確保 change_tracking 統計資訊保持更新
我正在使用 Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64) Jun 15 2019 23:15:58 版權所有 (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 (建構 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
我不時看到,獲取某些表的最新更改的查詢需要很長時間才能完成,並且會產生大量 CPU。為了解決這個問題,我設置了每天晚上執行的更改跟踪表的每日更新統計資訊。它有很大幫助,但有時,在使用者活躍的日子裡,即使在白天,我也必須執行此更新統計資訊。當我在這些表上執行更新統計資訊時,情況恢復正常,獲取最新更改的查詢在一段時間內執行良好。
我們對應用程序的某些重要部分使用更改跟踪,因此它必須工作。
是否有任何選項,我可以啟用跟踪標誌來幫助更改跟踪統計資訊?任何有對高活動數據庫進行更改跟踪的經驗的人都可以給我一些建議嗎?
所以我最終決定做一個工作來檢查自上次統計更新以來更改跟踪表是否更改了超過 20k 行,然後該作業將更新更改跟踪表上的統計資訊。
如果它可以幫助其他人,我會將查詢放在這裡。此查詢為您提供自上次更新統計資訊以來表更改超過 20k 次的更改跟踪表的所有統計資訊。它為您提供了帶有要更新的 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
由於您使用的是具有 DB 兼容模式的 SQL Server 2016,因此 TF 2371 的行為是預設行為。
您不再需要在 SQL Server 2016 或更高版本中啟用跟踪標誌 2371,因為預設情況下會啟用相應的行為。
您應該啟用
auto update async
數據庫選項,以便當 sql server 更新統計資訊時,它不會影響您的工作量。更改此 db 選項是線上操作。您可以做的是利用
sys.dm_db_stats_properties
新的 DMV 來決定是否必須手動更新表的統計資訊。您可以將 sql 代理作業配置為每 x 分鐘或每小時檢查和更新某些關鍵表的統計資訊。