如何檢測 tempdb 的使用情況?
在本地,我們在
READ_COMMITTED
隔離級別下使用 SQL Server 2019 標準版,我想測試一個數據庫的性能READ_COMMITTED_SNAPSHOT
(Azure 預設)。查詢儲存已啟用。
我想用
READ_COMMITED
一周記錄一些指標(CPU 使用率、tempdb 使用率、IO),然後用READ_COMMITTED_SNAPSHOT
. 然後如果性能更好(我期望),計劃如何(如果)擴展資源以啟動所有數據庫的隔離級別。我們有記錄 CPU 使用情況的工具,但沒有記錄 tempdb 的工具。我想知道是否有一個查詢或實用程序可以用來獲取目前的 tempdb 使用情況(例如在給定時刻 20-50-70%)並創建這樣的日誌?
我對 tempdb 很感興趣,因為行版本將儲存在那裡,我擔心一些遺留程式碼和大量/長時間執行的更新,我可能需要首先重寫這些更新以切換隔離級別。
我正在尋找這些數據,因為有很多遺留程式碼執行起來很慢並且會阻塞其他查詢。我有新程式碼在幾毫秒內執行,但有時,由於長時間執行的 CRUD 操作和阻塞,它執行了 25+ 秒,這很糟糕。我正在重寫此類遺留程式碼,但有時特定情況會花費我幾天,有時甚至幾個月。當然,客戶討厭等待……
檸檬頭
一些替代方法,如果您不想將有關伺服器的所有內容都記錄到表中。由於您想專門擷取版本儲存,因此這些通常可能更有用。
SELECT SUM(user_object_reserved_page_count) * 8 / 1024.0 / 1024.0 AS user_objects_gb, SUM(internal_object_reserved_page_count) * 8 / 1024.0 / 1024.0 AS internal_objects_gb, SUM(version_store_reserved_page_count) * 8 / 1024.0 / 1024.0 AS version_store_gb, SUM(unallocated_extent_page_count) * 8 / 1024.0 / 1024.0 AS free_space_gb, SUM(mixed_extent_page_count) * 8 / 1024.0 / 1024.0 AS mixed_extent_gb FROM tempdb.sys.dm_db_file_space_usage; SELECT DB_NAME(database_id) AS database_name, reserved_page_count, reserved_space_kb FROM sys.dm_tran_version_store_space_usage; SELECT dopc.object_name, dopc.counter_name, dopc.instance_name, dopc.cntr_value FROM sys.dm_os_performance_counters AS dopc WHERE dopc.counter_name IN ( 'Longest Transaction Running Time' , 'Version Store Size (KB)' , 'Version Cleanup rate (KB/s)' , 'Version Generation rate (KB/s)' );
您還可以將 sp_WhoIsActive 記錄到表中以在查詢級別擷取 tempdb 使用情況,但這不會區分版本儲存和臨時對像等。
布倫特奧扎方式
您可以設置Brent Ozar 的工具來監控數據庫使用情況(與 perfmon 數據一樣)。
在 dba 數據庫上添加他的腳本後,您必須通過使用
sp_BlitzFirst
儲存過程安排定期收集數據。這是我個人所做的(您必須將參數替換為適合您環境的參數):
EXEC sp_BlitzFirst @OutputDatabaseName = 'AdminSQL', @OutputSchemaName = 'dbo', @OutputTableName = 'BlitzFirst', @OutputTableNameFileStats = 'BlitzFirst_FileStats', @OutputTableNamePerfmonStats = 'BlitzFirst_PerfmonStats', @OutputTableNameWaitStats = 'BlitzFirst_WaitStats', @OutputTableNameBlitzCache = 'BlitzCache', @OutputTableNameBlitzWho = 'BlitzWho'; DECLARE @retentionPoint AS DATETIME2 = dateadd(week, -2, getdate()); DELETE FROM [dbo].[BlitzCache] WHERE CheckDate < @retentionPoint; DELETE FROM [dbo].[BlitzFirst] WHERE CheckDate < @retentionPoint; DELETE FROM [dbo].[BlitzFirst_FileStats] WHERE CheckDate < @retentionPoint; DELETE FROM [dbo].[BlitzFirst_PerfmonStats] WHERE CheckDate < @retentionPoint; DELETE FROM [dbo].[BlitzFirst_WaitStats] WHERE CheckDate < @retentionPoint; DELETE FROM [dbo].[BlitzWho] WHERE CheckDate < @retentionPoint;
我通過 SQL Server 代理每 15 或 30 分鐘執行一次,具體取決於我想要分析的精度。
獲得所需數據後,您只需使用 PowerBI 或 Excel 等工具收集增量視圖即可顯示圖表:
SELECT * FROM dbo.BlitzFirst_PerfmonStats_Deltas WHERE CheckDate >= @analyzisStartDate AND CheckDate <= @analyzisEndDate; SELECT * FROM dbo.BlitzFirst_WaitStats_Deltas WHERE CheckDate >= @analyzisStartDate AND CheckDate <= @analyzisEndDate;
Microsoft SQL Server DataCollector 方式
您可以通過“管理”>“數據收集”將 DataCollection 設置為 DataCollector 。
然後,一旦數據收集有足夠的數據,您就可以簡單地使用來自DataCollector 數據倉庫的報告。
小心,因為這個解決方案越來越被棄用。 查詢儲存以某種方式試圖替換它,但分析並沒有採用 DataCollection 所做的高度。