SQL Server 2014を2つのコアと最大メモリ6GBで実行しています。バッファプールの内容を確認すると、TempDBが1 GBのメモリを使用していることがわかります。それが私が使ったクエリです:
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で、ほぼ50%がTempDBによって使用されています
TempDBが非常に大きい理由を誰かが説明しようとすることはできますか?
[〜#〜] update [〜#〜] 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 = 435280365092864メタデータ:PartitionId = 0メタデータ: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フラグメントID = 1割り当てステータス
GAM(1:2)=割り当てられていませんSGAM(1:3)=割り当てられていません
PFS(1:153672)= 0x0 0_PCT_FULL DIFF(1:6)=変更されていません
ML(1:7)= MIN_LOGGEDではない
これは、クラスター化インデックス(indexid = 1)のリーフにあるテーブル変数または一時テーブル(-1948083318の負のオブジェクトID)のデータページ(ページタイプ= 1)のように見えます。
割り当て情報と、これが2番目のクエリに表示されないという事実から、おそらく基になるオブジェクトが削除されていると考えられます。運がよければ、アロケーションユニットIDをsys.fn_dblog
で探すことで、元のオブジェクト名などの追加情報を取得できる場合があります。
ドロップされたオブジェクトに属している場合は、これらのページがフリーリストに掲載される最初の候補であることを期待できます。
ただし、記事 TempDBメモリリーク? および 関連する接続項目 は、この領域に問題がある可能性があることを示しています...