Sql-Server

TempDB 在緩衝池中使用了大量空間

  • April 22, 2016

我正在執行具有 2 個核心和最大記憶體為 6GB 的 SQL Server 2014。當我檢查緩衝池中的內容時,我看到 TempDB 使用了 1GB 的記憶體。這就是我使用的查詢:

SELECT COUNT(*) AS cached_pages_count ,
(count(*) * 8.0)/1024 as MB,
       CASE database_id
         WHEN 32767 THEN 'ResourceDb'
         ELSE DB_NAME(database_id)
       END AS Database_name
   FROM sys.dm_os_buffer_descriptors
   GROUP BY DB_NAME(database_id) ,
       database_id
   ORDER BY cached_pages_count DESC;

但是當我檢查 TempDB 中有哪些表時,只有 40 個表,它們使用 728KB。這是查詢:

SELECT 
   t.NAME AS TableName,
   s.Name AS SchemaName,
   p.rows AS RowCounts,
   SUM(a.total_pages) * 8 AS TotalSpaceKB, 
   SUM(a.used_pages) * 8 AS UsedSpaceKB, 
   (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
GROUP BY  t.Name, s.Name, p.Rows
ORDER BY  t.Name

我還檢查了 sys.dm_db_session_space_usage 以查看是否有會話分配了 TempDB 中的所有空間

我的緩衝區記憶體為 2.2GB,TempDB 佔用了將近 50%

有人可以嘗試解釋為什麼 TempDB 這麼大嗎?

更新 我對 dm_os_buffer_descriptors 中的一些頁面進行了 DBCC PAGE,看起來它們沒有分配(GAM/SGAM 未分配,PFS 0_PCT_FULL)

頁眉:

頁面@0x0000000DB026C000

m_pageId = (1:159735) m_headerVersion = 1

m_type = 1 m_typeFlagBits = 0x0 m_level = 0

m_flagBits = 0x20 m_objId (AllocUnitId.idObj) = -1948083318

m_indexId (AllocUnitId.idInd) = 1 元數據:AllocUnitId = 43528036500928 元數據: : IndexId = -1 元數據: ObjectId = 0 m_prevPage = (1:160115) m_nextPage = (1:160144) pminlen = 13 m_slotCnt = 217 m_freeCnt = 3406

m_freeData = 4352 m_reservedCnt = 0 m_lsn = (13668:97392:89) m_xactReserved = 0

m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = 0

DB Frag ID = 1

分配狀態

GAM (1:2) = 未分配 SGAM (1:3) =

未分配 PFS (1:153672) = 0x0 0_PCT_FULL DIFF (1:6) = 未更改

ML (1:7) = 未最小記錄

這看起來像是來自聚集索引 (indexid=1) 葉子中的表變數或臨時表(負對象 id 為 -1948083318)的數據頁(頁麵類型=1)。

從分配資訊和第二個查詢中沒有顯示的事實推測,基礎對像已被刪除。sys.fn_dblog如果幸運的話,您可以通過在其中查找分配單元 ID 來獲得有關它的其他資訊,例如原始對象名稱。

如果它屬於一個丟棄的對象,那麼人們當然希望這些頁面是放入空閒列表的第一個候選者。

但是文章TempDB 記憶體洩漏?相關的連接項表明該區域可能存在問題…

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