DBCC MEMORYSTATUS コマンドを使用して SQL Server のメモリ使用量を監視する
この記事では、 DBCC MEMORYSTATUS
コマンドを使用してメモリ使用量を監視する方法について説明します。
元の製品バージョン: SQL Server
元の KB 番号: 907877
はじめに
DBCC MEMORYSTATUS
コマンドは、Microsoft SQL Server と OS の現在のメモリ状態のスナップショットを提供します。 これは、SQL Server でのメモリの分散と使用状況の最も詳細な出力の 1 つを提供します。 出力を使用して、SQL Server でのメモリ消費の問題のトラブルシューティングや、特定のメモリ不足エラーのトラブルシューティングを行うことができます。 メモリ不足エラーの多くは、この出力をエラー ログに自動的に生成します。 メモリ不足の状態に関連するエラーが発生した場合は、DBCC MEMORYSTATUS
コマンドを実行し、Microsoft サポートに連絡したときに出力を指定できます。
DBCC MEMORYSTATUS
コマンドの出力には、メモリ管理、メモリ使用量、集計メモリ情報、バッファー プール情報、プロシージャ キャッシュ情報のセクションが含まれています。 また、グローバル メモリ オブジェクト、クエリ メモリ オブジェクト、最適化、メモリ ブローカーの出力についても説明します。
Note
の場合、パフォーマンス モニター (PerfMon) とタスク マネージャーはメモリ使用量全体を考慮しません[メモリ内のロックされたページオプションが有効になっています。 アドレス ウィンドウ拡張機能 (AWE) API メモリ使用量を示すパフォーマンス カウンターはありません。
重要
DBCC MEMORYSTATUS
コマンドは、Microsoft サポートの診断ツールを目的としています。 出力の形式と提供される詳細レベルは、サービス パックと製品リリースの間で変更される可能性があります。 DBCC MEMORYSTATUS
コマンドによって提供される機能は、新しい製品バージョンでは別のメカニズムに置き換えられる場合があります。 そのため、それ以降の製品バージョンでは、このコマンドが機能しなくなる可能性があります。 このコマンドを変更または削除する前に、追加の警告は表示されません。 そのため、このコマンドを使用するアプリケーションは、警告なしで中断する可能性があります。
DBCC MEMORYSTATUS
コマンドの出力は、以前のリリースの SQL Server から変更されました。 現在、以前の製品バージョンでは使用できなかった複数のテーブルが含まれています。
DBCC MEMORYSTATUS の使用方法
DBCC MEMORYSTATUS
は、通常、SQL Server によって報告されるメモリ不足の問題を調査するために使用されます。 SQL Server プロセスの外部からの外部メモリの負荷またはプロセス内で発生する内部負荷がある場合、メモリ不足が発生する可能性があります。 内部圧力は、SQL Server データベース エンジン、またはプロセス内で実行される他のコンポーネント (リンク サーバー、XPs、SQLCLR、侵入防止、ウイルス対策ソフトウェアなど) によって発生する可能性があります。 メモリ不足のトラブルシューティング方法の詳細については、「 SQL Server でのメモリ不足またはメモリ不足の問題のトラブルシューティングを参照してください。
コマンドを使用してその結果を解釈するための一般的な手順を次に示します。 特定のシナリオでは、出力に少し異なる方法でアプローチすることが必要になる場合がありますが、全体的なアプローチの概要を次に示します。
DBCC MEMORYSTATUS
コマンドを実行します。- Process/System Counts および Memory Manager セクションを使用して、外部メモリ不足 (たとえば、コンピューターが物理メモリまたは仮想メモリに不足しているか、SQL Server ワーキング セットがページアウトされているか) を確認します。 また、これらのセクションを使用して、システム上の全体的なメモリと比較して、SQL Server データベース エンジンが割り当てたメモリの量を確認します。
- 外部のメモリ負荷が発生していることを確認した場合は、他のアプリケーションと OS によるメモリ使用量を減らすか、RAM を追加してみてください。
- SQL Server エンジンがほとんどのメモリ (内部メモリ負荷) を使用していることを確認した場合は、
DBCC MEMORYSTATUS
の残りのセクションを使用して、どのコンポーネント (メモリ クラーク、キャッシュストア、UserStore、またはオブジェクトストア) がこのメモリ使用量の最大の要因であるかを特定できます。 - 各コンポーネント (
MEMORYCLEARK
、CACHESTORE
、USERSTORE
、OBJECTSTORE
) を確認します。 割り当てられたページの値を調べて、そのコンポーネントが SQL Server 内で消費しているメモリの量を確認します。 ほとんどのデータベース エンジン メモリ コンポーネントの簡単な説明については、 Memory Clerk の種類 表を参照してください。- まれに、割り当ては SQL Server メモリ マネージャーを経由するのではなく、直接の仮想割り当てになります。 このような場合は、割り当てられたページではなく、特定のコンポーネントの VM コミット済み値を調べます。
- コンピューターで NUMA を使用している場合、一部のメモリ コンポーネントはノードごとに分割されます。 たとえば、
OBJECTSTORE_LOCK_MANAGER (node 0)
、OBJECTSTORE_LOCK_MANAGER (node 1)
、OBJECTSTORE_LOCK_MANAGER (node 2)
などを観察し、最後にOBJECTSTORE_LOCK_MANAGER (Total)
内の各ノードの合計値を確認できます。 始めるのに最適な場所は、合計値を報告し、必要に応じて内訳を調べるセクションです。 詳細については、「 NUMA ノードでのメモリ使用量を参照してください。
DBCC MEMORYSTATUS
の一部のセクションでは、特定のメモリ アロケーターに関する詳細で特殊な情報が提供されます。 これらのセクションを使用して、追加の詳細を理解し、メモリ クラーク内の割り当ての詳細を確認できます。 このようなセクションの例としては、バッファー プール (データとインデックス キャッシュ)、プロシージャ キャッシュ/プラン キャッシュ、クエリ メモリ オブジェクト (メモリ許可)、最適化キューと小規模ゲートウェイ、および中/大ゲートウェイ (オプティマイザー メモリ) などがあります。 SQL Server のメモリの特定のコンポーネントがメモリ不足の原因であることが既にわかっている場合は、その特定のセクションに直接移動することをお勧めします。 たとえば、メモリ 許可の使用率が高く、メモリ エラーの原因となる何らかの方法で確立した場合は、 Query メモリ オブジェクト セクションを確認できます。
この記事の残りの部分では、メモリの問題をより効果的に診断できる DBCC MEMORYSTATUS
出力の便利なカウンターの一部について説明します。
プロセス/システム数
このセクションでは、サンプル出力を表形式で示し、その値について説明します。
Process/System Counts Value
------------------------------------ ------------
Available Physical Memory 5060247552
Available Virtual Memory 140710048014336
Available Paging File 7066804224
Working Set 430026752
Percent of Committed Memory in WS 100
Page Faults 151138
System physical memory high 1
System physical memory low 0
Process physical memory low 0
Process virtual memory low 0
次の一覧では、値とその説明について説明します。
- 使用可能な物理メモリ: この値は、コンピューター上の空きメモリの全体的な量を示します。 この例では、空きメモリは 5,060,247,552 バイトです。
- 使用可能な仮想メモリ: この値は、SQL Server プロセスの空き仮想メモリの全体的な量が 140,710,048,014,336 バイト (128 TB) であることを示します。 詳細については、「メモリとアドレス空間の制限」を参照してください。
- 使用可能なページング ファイル: この値は、空きページング ファイル領域を示します。 この例では、値は 7,066,804,224 バイトです。
- ワーキング セット: この値は、SQL Server プロセスが RAM 内に存在する (ページアウトされていない) 仮想メモリの全体的な量が 430,026,752 バイトであることを示します。
- WS のコミット済みメモリの割合: この値は、割り当てられた SQL Server の仮想メモリが RAM (またはワーキング セット) に存在する割合を示します。 100% の値は、コミットされたすべてのメモリが RAM に格納され、その 0% がページ アウトされていることを示しています。
- ページ フォールト: この値は、SQL Server のハード ページ フォールトとソフト ページ フォールトの全体的な量を示します。 この例では、値は 151,138 です。
残りの 4 つの値はバイナリまたはブール値です。
- システム物理メモリの高 値が 1 の場合は、SQL Server がコンピューターで使用可能な物理メモリが高いとみなしていることを示します。 そのため、 System 物理メモリの値が低い は 0 であり、メモリが不足していないことを意味します。 同様のロジックが Process 物理メモリの不足 と Process 仮想メモリの不足に適用されます。ここで、0 は false、1 は true であることを意味します。 この例では、両方の値が 0 です。つまり、SQL Server プロセスには物理メモリと仮想メモリが十分に存在します。
Memory Manager
このセクションでは、SQL Server による全体的なメモリ消費量を示すメモリ マネージャーの出力例を示します。
Memory Manager KB
-------------------------- --------------------
VM Reserved 36228032
VM Committed 326188
Locked Pages Allocated 0
Large Pages Allocated 0
Emergency Memory 1024
Emergency Memory In Use 16
Target Committed 14210416
Current Committed 326192
Pages Allocated 161904
Pages Reserved 0
Pages Free 5056
Pages In Use 286928
Page Alloc Potential 15650992
NUMA Growth Phase 0
Last OOM Factor 0
Last OS Error 0
次の一覧では、出力の値とその説明について説明します。
VM 予約済み: この値は、SQL Server が予約した仮想アドレス空間 (VAS) または仮想メモリ (VM) の全体的な量を示します。 仮想メモリ予約では、実際には物理メモリは使用されません。これは単に、仮想アドレスが大規模な VAS 内から確保されることを意味します。 詳細については、 VirtualAlloc() MEM_RESERVEを参照してください。
VM Committed: この値は、SQL Server がコミットした仮想メモリ (VM) の全体的な量 (KB 単位) を示します。 つまり、プロセスで使用されるメモリは、物理メモリによってサポートされるか、ページ ファイルによって頻繁にサポートされます。 以前に予約されたメモリ アドレスは、物理ストレージによってサポートされるようになりました。割り当てられていることを示します。 メモリ内のロックされたページが有効になっている場合、SQL Server は別の方法を使用してメモリを割り当てます。AWE API とほとんどのメモリはこのカウンターに反映されません。 これらの割り当てについては、「割り当てられたロックされたページ](割り当てられたページ #Locked)」を参照してください。 詳細については、 VirtualAlloc() MEM_COMMITを参照してください。
割り当てられたページ: この値は、SQL Server データベース エンジンによって割り当てられたメモリ ページの合計数を示します。
割り当てられたロックされたページ: この値は、AWE API を使用して SQL Server が物理 RAM で割り当ておよびロックしたメモリの量 (KB 単位) を表します。 SQL Server がアクティブに使用しているメモリの量を示し、パフォーマンスを最適化するためにメモリに保持するよう要求しました。 SQL Server は、メモリ内のページをロックすることで、重要なデータベース ページをすぐに使用でき、ディスクにスワップできないようにします。 詳細については、「 Address Windows Extensions (AWE) メモリを参照してください。 値が 0 の場合は、"メモリ内のロックされたページ" 機能が現在無効になっており、SQL Server が代わりに仮想メモリを使用していることを示します。 このような場合、VM Committed 値は SQL Server に割り当てられたメモリを表します。
割り当てられた大きなページ: この値は、大きなページを使用して SQL Server によって割り当てられたメモリの量を表します。 Large Pages は、オペレーティング システムによって提供されるメモリ管理機能です。 この機能では、標準のページ サイズ (通常は 4 KB) を使用する代わりに、2 MB や 4 MB などのより大きなページ サイズを使用します。 値が 0 の場合は、機能が有効になっていないことを示します。 詳細については、 Virtual Alloc() MEM_LARGE_PAGESを参照してください。
Target Committed: この値は、SQL Server がコミットすることを目的とするメモリのターゲット量を示します。これは、最近のワークロードに基づいて SQL Server が使用できるメモリの理想的な量を示します。
Current Committed: この値は、SQL Server メモリ マネージャーが現在コミットしているオペレーティング システムのメモリの量 (KB 単位) を示します (物理ストアに割り当てられます)。 この値には、"メモリ内のロックされたページ" (AWE API) または仮想メモリが含まれます。 したがって、この値は、割り当てられた VM のコミット済みページまたはロックされたページに近いか、または同じです。 SQL Server が AWE API を使用する場合、一部のメモリは引き続き OS Virtual Memory Manager によって割り当てられ、VM コミット済みとして反映されることに注意してください。
NUMA 拡張フェーズ: この値は、SQL Server が現在 NUMA 拡張フェーズにあるかどうかを示します。 コンピューター上に NUMA ノードが存在する場合のメモリの初期ランプ アップの詳細については、「 方法: SQL Server (NUMA ローカル、外部、および離れたメモリ ブロック)を参照してください。
最後の OS エラー: この値は、システムにメモリ不足があったときに発生した最後の OS エラーを示します。 SQL Server はその OS エラーを記録し、出力に表示します。 OS エラーの完全な一覧については、「 システム エラー コード」を参照してください。
NUMA ノードでのメモリ使用量
[Memory Manager] セクションの後に、各メモリ ノードのメモリ使用量の概要が表示されます。 非均一メモリ アクセス (NUMA) が有効なシステムでは、各ハードウェア NUMA ノードに対応するメモリ ノード エントリがあります。 SMP システムには、1 つのメモリ ノード エントリがあります。 同じパターンが他のメモリ セクションに適用されます。
Memory node Id = 0 KB
----------------------- -----------
VM Reserved 21289792
VM Committed 272808
Locked Pages Allocated 0
Pages Allocated 168904
Pages Free 3040
Target Committed 6664712
Current Committed 272808
Foreign Committed 0
Away Committed 0
Taken Away Committed 0
Note
Memory node Id
値がハードウェア ノード ID に対応していない可能性があります。- これらの値は、この NUMA ノードで実行されているスレッドによって割り当てられたメモリを示します。 これらの値は、NUMA ノードに対してローカルなメモリではありません。
- すべてのメモリ ノードの VM 予約済み値と VM Committed 値の合計は、Memory Manager テーブルで報告される対応する値よりもわずかに小さくなります。
- NUMA ノード 64 (ノード 64) は DAC 用に予約されており、この接続では限られたメモリ リソースが使用されるため、メモリ調査にはほとんど関心がありません。 専用管理者接続 (DAC) の詳細については、「データベース管理者 Diagnostic 接続を参照してください。
次の一覧では、出力テーブルの値とその説明について説明します。
- VM 予約済み: このノードで実行されているスレッドによって予約されている仮想アドレス空間 (VAS) が表示されます。
- VM のコミット: このノードで実行されているスレッドによってコミットされた VAS が表示されます。
メモリの集計
次の表に、各クラークの種類と NUMA ノードの集計メモリ情報を示します。 NUMA 対応システムの場合、次のような出力が表示される場合があります。
MEMORYCLERK_SQLGENERAL (node 0) KB
------------------------------ --------------------
VM Reserved 0
VM Committed 0
Locked Pages Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 5416
MEMORYCLERK_SQLGENERAL (node 1) KB
------------------------------- --------------------
VM Reserved 0
VM Committed 0
Locked Pages Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 136
MEMORYCLERK_SQLGENERAL (Total) KB
------------------------------- --------------------
VM Reserved 0
VM Committed 0
Locked Pages Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 5552
Pages Allocated
の値は、特定のコンポーネント (メモリ クラーク、ユーザーストア、オブジェクトストア、またはキャッシュ ストア) によって割り当てられるメモリ ページの合計数を示します。
Note
これらのノード ID は、SQL Server を実行しているコンピューターの NUMA ノード構成に対応します。 ノード ID には、ハードウェア NUMA ノードの上または SMP システムの上に定義されている、考えられるソフトウェア NUMA ノードが含まれます。 各ノードのノード ID と CPU 間のマッピングを見つけるには、情報イベント ID 17152 を参照してください。 このイベントは、SQL Server の起動時にイベント ビューアーアプリケーション ログに記録されます。
SMP システムの場合は、DAC で使用されるノード = 64 ではなく、書記の種類ごとに 1 つのテーブルのみが表示されます。 次の表は、次の例のようになります。
MEMORYCLERK_SQLGENERAL (Total) KB
--------------------------------- --------------------
VM Reserved 0
VM Committed 0
AWE Allocated 0
SM Reserved 0
SM Commited 0
Pages Allocated 2928
これらのテーブルのその他の情報は、共有メモリに関する情報です。
- SM 予約済み: メモリ マップト ファイル API を使用するこの種のすべてのクラークによって予約されている VAS が表示されます。 この API は、 共有メモリとも呼ばれます。
- SM Committed: メモリ マップト ファイル API を使用しているこの種のすべてのクラークによってコミットされた VAS が表示されます。
別の方法として、 sys.dm_os_memory_clerks 動的管理ビュー (DMV) を使用して、すべてのメモリ ノードの各クラークの種類の概要情報を取得できます。 これを行うには、次のクエリを実行します。
SELECT
TYPE,
SUM(virtual_memory_reserved_kb) AS [VM Reserved],
SUM(virtual_memory_committed_kb) AS [VM Committed],
SUM(awe_allocated_kb) AS [AWE Allocated],
SUM(shared_memory_reserved_kb) AS [SM Reserved],
SUM(shared_memory_committed_kb) AS [SM Committed],
-- SUM(multi_pages_kb) AS [MultiPage Allocator], /*Applies to: SQL Server 2008 (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
-- SUM(single_pages_kb) AS [SinlgePage Allocator], /*Applies to: SQL Server 2008 (10.0.x) through SQL Server 2008 R2 (10.50.x).*/
SUM(pages_kb) AS [Page Allocated] /*Applies to: SQL Server 2012 (11. x) and later.*/
FROM sys.dm_os_memory_clerks
GROUP BY TYPE
バッファー プールの詳細
これは、バッファー プール内のさまざまな状態データとインデックス ページ (データ キャッシュとも呼ばれます) の内訳を提供する重要なセクションです。 次の出力表は、バッファー プールとその他の情報に関する詳細を示しています。
Buffer Pool Pages
------------------------------------------------- ---------
Database 5404
Simulated 0
Target 16384000
Dirty 298
In IO 0
Latched 0
IO error 125
In Internal Pool 0
Page Life Expectancy 3965
次の一覧では、出力の値とその説明について説明します。
- データベース: データベース コンテンツ (データ ページとインデックス ページ) を持つバッファー (ページ) の数を示します。
- ターゲット: バッファー プールのターゲット サイズ (バッファー数) を示します。 この記事の前 セクションの「Target Committed memory」を参照してください。
- ダーティ: データベースコンテンツを持ち、変更されたページを表示します。 これらのバッファーには、通常、チェックポイント プロセスによってディスクにフラッシュする必要がある変更が含まれています。
- IO: 保留中の I/O 操作を待機しているバッファーを示します。 つまり、これらのページの内容は、ストレージに書き込まれるか、ストレージから読み取られます。
- ラッチ: ラッチされたバッファーを示します。 スレッドがページの内容を読み取ったり変更したりすると、バッファーがラッチされます。 ページがディスクから読み取られるか、ディスクに書き込まれると、バッファーもラッチされます。 ラッチは、読み取りまたは変更中にページ上のデータの物理的な一貫性を維持するために使用されます。 これに対し、ロックは論理整合性とトランザクション整合性を維持するために使用されます。
- IO エラー: I/O 関連の OS エラーが発生した可能性があるバッファーの数を示します (これは必ずしも問題を示すわけではありません)。
- ページの平均寿命: このカウンターは、最も古いページがバッファー プールに留まった時間を秒単位で測定します。
sys.dm_os_buffer_descriptors
DMV を使用して、データベース ページのバッファー プールに関する詳細情報を取得できます。 ただし、SQL Server ベースのサーバーで多数の RAM を使用することが許可されている場合は、長時間実行され、大きな出力が生成される可能性があるため、この DMV は慎重に使用してください。
プラン キャッシュ
このセクションでは、以前にプロシージャ キャッシュと呼ばれていたプラン キャッシュについて説明します。
Procedure Cache Value
----------------------- -----------
TotalProcs 4
TotalPages 25
InUsePages 0
次の一覧では、出力の値とその説明について説明します。
TotalProcs: この値は、プロシージャ キャッシュに現在キャッシュされているオブジェクトの合計数を示します。 この値は、
sys.dm_exec_cached_plans
DMV 内のエントリの数と一致します。Note
この情報の動的な性質のため、一致が正確ではない可能性があります。 PerfMon を使用すると、SQL Server: Plan Cache オブジェクトと
sys.dm_exec_cached_plans
DMV を監視し、トリガー、プロシージャ、アドホック オブジェクトなど、キャッシュされたオブジェクトの種類に関する詳細情報を確認できます。TotalPages: プランまたはプロシージャ キャッシュにキャッシュされたすべてのオブジェクトを格納するために使用される累積ページを表示します。 この数値に 8 KB を乗算すると、KB 単位で表される値を取得できます。
InUsePages: 現在アクティブなプロシージャに属しているプロシージャ キャッシュ内のページを表示します。 これらのページは破棄できません。
グローバル メモリ オブジェクト
このセクションには、さまざまなグローバル メモリ オブジェクトと、それらが使用するメモリの量に関する情報が含まれています。
Global Memory Objects Buffers
---------------------------------- ----------------
Resource 576
Locks 96
XDES 61
DirtyPageTracking 52
SETLS 8
SubpDesc Allocators 8
SE SchemaManager 139
SE Column Metadata Cache 159
SE Column Metadata Cache Store 2
SE Column Store Metadata Cache 8
SQLCache 224
Replication 2
ServerGlobal 1509
XP Global 2
SortTables 3
次の一覧では、出力の値とその説明について説明します。
- Resource: Resource オブジェクトが使用するメモリを表示します。 これは、さまざまなサーバー全体の構造に対してストレージ エンジンによって使用されます。
- ロック: ロック マネージャーによって使用されるメモリが表示されます。
- XDES: トランザクション マネージャーによって使用されるメモリが表示されます。
- SETLS: スレッド ローカル ストレージ (TLS) を使用するストレージ エンジン固有のスレッドごとの構造の割り当てに使用されるメモリを示します。 詳細については、「 ローカル ストレージの読み取り」を参照してください。
- SubpDesc Allocators: 並列クエリ、バックアップ操作、復元操作、データベース操作、ファイル操作、ミラーリング、非同期カーソルのサブプロセスの管理に使用されるメモリを示します。 これらのサブプロセスは、"並列プロセス" とも呼ばれます。
- SE SchemaManager: Schema Manager がストレージ エンジン固有のメタデータを格納するために使用するメモリを示します。
- SQLCache: アドホックおよび準備されたステートメントのテキストを保存するために使用されるメモリを示します。
- レプリケーション: サーバーが内部レプリケーション サブシステムに使用するメモリを示します。
- ServerGlobal: 複数のサブシステムによって一般的に使用されるグローバル サーバー メモリ オブジェクトを表示します。
- XP グローバル: 拡張ストアド プロシージャによって使用されるメモリが表示されます。
- SortTables: 並べ替えテーブルで使用されるメモリを表示します。
メモリ オブジェクトのクエリを実行する
このセクションでは、クエリ メモリ許可情報について説明します。 また、クエリ メモリ使用量のスナップショットも含まれます。 クエリ メモリは"ワークスペース メモリ" とも呼ばれます。
Query Memory Objects (default) Value
---------------------------------------- -------
Grants 0
Waiting 0
Available 436307
Current Max 436307
Future Max 436307
Physical Max 436307
Next Request 0
Waiting For 0
Cost 0
Timeout 0
Wait Time 0
クエリのサイズとコストが "小さい" クエリ メモリのしきい値を満たしている場合、クエリは小さなクエリ キューに格納されます。 この動作により、キューに既に存在する大規模なクエリの背後で小さなクエリが遅延するのを防ぐことができます。
次の一覧では、出力の値とその説明について説明します。
- 許可: メモリ許可を持つ実行中のクエリの数を示します。
- 待機中: メモリ許可の取得を待機しているクエリの数を示します。
- 使用可能: ハッシュ ワークスペースおよび並べ替えワークスペースとして使用するクエリで使用できるバッファーを示します。
Available
値は定期的に更新されます。 - 次の要求: 次の待機クエリのメモリ要求サイズをバッファー単位で表示します。
- 待機中: 次の要求の値が参照するクエリを実行するために使用できる必要があるメモリの量を示します。 待機中の値は、
Next Request
値にヘッドルーム係数を乗算した値です。 この値により、次の待機クエリの実行時に特定の量のメモリが使用できるようになることが効果的に保証されます。 - コスト: 次の待機中のクエリのコストを示します。
- タイムアウト: 次の待機中のクエリのタイムアウトを秒単位で表示します。
- [待機時間: 次の待機中のクエリがキューに格納された後の経過時間をミリ秒単位で表示します。
- 現在の最大: クエリ実行の全体的なメモリ制限を示します。 この値は、大規模なクエリ キューと小さなクエリ キューの両方に対する結合された制限です。
メモリ許可の概要、これらの値の意味、メモリ許可のトラブルシューティング方法の詳細については、「 SQL Server でのメモリ許可によって発生するパフォーマンスの低下またはメモリ不足の問題をトラブルシューティングするを参照してください。
最適化メモリ
クエリはコンパイルのためにサーバーに送信されます。 コンパイル プロセスには、解析、代数化、および最適化が含まれます。 クエリは、コンパイル プロセス中に各クエリが消費するメモリに基づいて分類されます。
Note
この量には、クエリの実行に必要なメモリは含まれません。
クエリが開始されると、コンパイルできるクエリの数に制限はありません。 メモリ消費量が増加し、しきい値に達すると、クエリはゲートウェイを通過して続行する必要があります。 各ゲートウェイの後に同時にコンパイルされるクエリの制限は徐々に減少しています。 各ゲートウェイのサイズは、プラットフォームと負荷によって異なります。 ゲートウェイのサイズは、スケーラビリティとスループットを最大化するために選択されます。
クエリがゲートウェイを通過できない場合は、メモリが使用可能になるまで待機するか、タイムアウト エラー (エラー 8628) を返します。 さらに、クエリをキャンセルした場合、またはデッドロックが検出された場合、クエリでゲートウェイが取得されない可能性があります。 クエリが複数のゲートウェイを渡した場合、コンパイル プロセスが完了するまで、小さいゲートウェイは解放されません。
この動作により、同時に発生するメモリ負荷の高いコンパイルはごくわずかです。 さらに、この動作により、小さなクエリのスループットが最大化されます。
次の表では、クエリの最適化に十分なメモリがないために発生するメモリ待機の詳細を示します。 内部メモリは、システム クエリで使用されるオプティマイザー メモリを考慮しますが、既定では、ユーザーまたはアプリケーション クエリの最適化メモリを報告します。
Optimization Queue (internal) Value
---------------------------------- ----------------
Overall Memory 4013162496
Target Memory 3673882624
Last Notification 1
Timeout 6
Early Termination Factor 5
Small Gateway (internal) Value
---------------------------------- ----------------
Configured Units 32
Available Units 32
Acquires 0
Waiters 0
Threshold Factor 380000
Threshold 380000
Medium Gateway (internal) Value
---------------------------------- ----------------
Configured Units 8
Available Units 8
Acquires 0
Waiters 0
Threshold Factor 12
Threshold -1
Big Gateway (internal) Value
---------------------------------- ----------------
Configured Units 1
Available Units 1
Acquires 0
Waiters 0
Threshold Factor 8
Threshold -1
Optimization Queue (default) Value
---------------------------------- ----------------
Overall Memory 4013162496
Target Memory 3542319104
Last Notification 1
Timeout 6
Early Termination Factor 5
Small Gateway (default) Value
---------------------------------- ----------------
Configured Units 32
Available Units 32
Acquires 0
Waiters 0
Threshold Factor 380000
Threshold 380000
Medium Gateway (default) Value
---------------------------------- ----------------
Configured Units 8
Available Units 8
Acquires 0
Waiters 2
Threshold Factor 12
Threshold -1
Big Gateway (default) Value
---------------------------------- ----------------
Configured Units 1
Available Units 1
Acquires 0
Waiters 0
Threshold Factor 8
Threshold -1
これらの値の一部の説明を次に示します。
- 構成済みユニット - ゲートウェイからコンパイル メモリを使用できる同時実行クエリの数を示します。 この例では、32 個の同時実行クエリで、Small ゲートウェイのメモリ (既定)、Medium ゲートウェイからの 8 つの同時実行クエリ、および Big ゲートウェイからの 1 つのクエリを使用できます。 前述のように、Small ゲートウェイが割り当てることができるメモリよりも多くのメモリがクエリに必要な場合は、中ゲートウェイに移動し、そのクエリは両方のゲートウェイでユニットを取得したとカウントされます。 クエリに必要なコンパイル メモリの量が多いほど、ゲートウェイで構成されているユニットが少なくなります。
- 使用可能なユニット - 構成されたユニットの一覧から同時実行クエリがコンパイルできるスロットまたはユニットの数を示します。 たとえば、32 ユニットを使用できるが、現在 3 つのクエリでコンパイル メモリが使用されている場合、
Available Units
は 32 から 3、つまり 29 単位になります。 - Acquires - コンパイルするクエリによって取得されたユニットまたはスロットの数を示します。 現在、3 つのクエリがゲートウェイのメモリを使用している場合、Acquires = 3 になります。
- Waiters - ゲートウェイのコンパイル メモリを待機しているクエリの数を示します。 ゲートウェイ内のすべてのユニットが使い果たされた場合、待機中のクエリの数を示す Waiters 値は 0 以外です。
- しきい値 - クエリがメモリを取得する場所、またはどのゲートウェイに留まるかを決定するゲートウェイ メモリ制限を示します。 クエリがしきい値を超える必要がない場合は、小さなゲートウェイにとどまります (クエリは常に小さなゲートウェイで開始されます)。 コンパイルのためにより多くのメモリが必要な場合は、中程度のメモリに移動し、そのしきい値がまだ不十分な場合は、ビッグ ゲートウェイに移動します。 小規模ゲートウェイの場合、x64 プラットフォームのしきい値係数は 380,000 バイト (将来のバージョンで変更される可能性があります) です。
- しきい値係数: 各ゲートウェイのしきい値を決定します。 小さいゲートウェイの場合、しきい値は定義済みであるため、係数も同じ値に設定されます。 中ゲートウェイとビッグ ゲートウェイのしきい値の要因は、オプティマイザー の合計メモリ (最適化キュー内の全体的なメモリ) の割合であり、それぞれ 12 と 8 に設定されます。 そのため、他の SQL Server メモリ コンシューマーがメモリを必要とするためメモリ全体を調整すると、しきい値の要因によってしきい値も動的に調整されます。
- Timeout: クエリがオプティマイザー メモリを待機する時間を定義する値を分単位で示します。 このタイムアウト値に達すると、セッションは待機を停止し、エラー 8628 -
A time out occurred while waiting to optimize the query. Rerun the query.
メモリ ブローカー
このセクションでは、キャッシュされたメモリ、盗まれたメモリ、および予約済みメモリを制御するメモリ ブローカーについて説明します。 これらのテーブルの情報は、内部診断にのみ使用できます。 そのため、この情報は詳細ではありません。
MEMORYBROKER_FOR_CACHE (internal) Value
--------------------------------------- -------------
Allocations 20040
Rate 0
Target Allocations 3477904
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_STEAL (internal) Value
--------------------------------------- -------------
Allocations 129872
Rate 40
Target Allocations 3587776
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_RESERVE (internal) Value
--------------------------------------- -------------
Allocations 0
Rate 0
Target Allocations 3457864
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_CACHE (default) Value
--------------------------------------- -------------
Allocations 44592
Rate 8552
Target Allocations 3511008
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_STEAL (default) Value
--------------------------------------- -------------
Allocations 1432
Rate -520
Target Allocations 3459296
Future Allocations 0
Overall 3919104
Last Notification 1
MEMORYBROKER_FOR_RESERVE (default) Value
--------------------------------------- -------------
Allocations 0
Rate 0
Target Allocations 3919104
Future Allocations 872608
Overall 3919104
Last Notification 1