Sql-Server
Tempdb 正在增長,但是它有很多可用空間
在專用於 Dynamics CRM 數據庫的 sql 伺服器上,我看到了一些奇怪的行為。
在使用以下查詢作為基礎監控增長時,我注意到 tempdb 在過去幾個小時內增長非常頻繁:
DECLARE @path NVARCHAR(1000) SELECT @path = Substring(PATH, 1, Len(PATH) - Charindex('\', Reverse(PATH))) + '\log.trc' FROM sys.traces WHERE id = 1 SELECT databasename, e.name AS eventname, cat.name AS [CategoryName], starttime, e.category_id, loginname, loginsid, spid, hostname, applicationname, servername, textdata, objectname, eventclass, eventsubclass FROM ::fn_trace_gettable(@path, 0) INNER JOIN sys.trace_events e ON eventclass = trace_event_id INNER JOIN sys.trace_categories AS cat ON e.category_id = cat.category_id WHERE e.name IN( 'Data File Auto Grow', 'Log File Auto Grow' ) ORDER BY starttime DESC
給出數據文件的幾行增長:
tempdb Data File Auto Grow Database 2015-03-02 09:50:33.187 2
但是,當我查看 tempdb 佔用的空間時,我沒有看到空間緊縮的位置:
USE tempdb GO SELECT DB_NAME() AS DbName, name AS FileName, size/128.0 AS CurrentSizeMB, size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS INT)/128.0 AS FreeSpaceMB FROM sys.database_files;
給出以下輸出:
DbName FileName CurrentSizeMB FreeSpaceMB tempdb tempdev 7500.000000 7492.625000 tempdb templog 156.132812 93.820312 tempdb tempdev2 7250.000000 7245.625000 tempdb tempdev3 7250.000000 7245.312500 tempdb tempdev4 7366.500000 7360.875000
維護 CRM 的人要求我們縮小 tempdb。
我的同事過去曾有義務。但是我不願意在沒有解釋的情況下這樣做。尤其是考慮到收縮已經成為幾乎每週都會發生的事情。
誰能告訴我為什麼 tempdb 有這麼多增長事件,以及如何正確處理?
我目前正在考慮要求更多儲存空間,並將 tempdb 驅動器增加 50%。
然而,這感覺就像治療症狀,而不是原因。
TempDB 文件的自動增長模型是什麼?微小的增量會導致許多小的自動增長,而大的增量會導致更少但更密集的增長常式。
大概是因為在伺服器上執行的查詢正在構造大量臨時表、表變數或游標等,所以 TempDB 正在增長?
是否知道正在執行哪些查詢,是否有歷史基線來比較自動增長和大小?
如果事情突然發生了變化,並且組織沒有顯著增加它使用的實際數據量,我猜想開發人員或報告使用者已經改變了他們執行查詢的方式。
關於上述內容,我認為我們需要您提供更多資訊。