web-dev-qa-db-ja.com

TempDBはバッファプールで多くのスペースを使用します

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メモリリーク? および 関連する接続項目 は、この領域に問題がある可能性があることを示しています...

2
Martin Smith