Sql-Server

Tempdb 正在增長,但是它有很多可用空間

  • January 3, 2018

在專用於 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 正在增長?

是否知道正在執行哪些查詢,是否有歷史基線來比較自動增長和大小?

如果事情突然發生了變化,並且組織沒有顯著增加它使用的實際數據量,我猜想開發人員或報告使用者已經改變了他們執行查詢的方式。

關於上述內容,我認為我們需要您提供更多資訊。

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