TempDB 在緩衝池中使用了大量空間
我正在執行具有 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 記憶體洩漏?和 相關的連接項表明該區域可能存在問題…