Sql-Server

如何檢測 tempdb 的使用情況?

  • December 16, 2021

在本地,我們在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 所做的高度。

引用自:https://dba.stackexchange.com/questions/303918