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
出力には、メモリ管理、メモリ使用量、集計メモリ情報、バッファー プール情報、プロシージャ キャッシュ情報のセクションが含まれます。 また、グローバル メモリ オブジェクト、クエリ メモリ オブジェクト、最適化、メモリ ブローカーの出力についても説明します。
注:
[メモリ内のロックされたページ] オプションが有効になっている場合、パフォーマンス モニター (PerfMon) とタスク マネージャーは完全なメモリ使用量を考慮しません。 アドレス ウィンドウ拡張機能 (AWE) API メモリ使用量を示すパフォーマンス カウンターはありません。
重要
コマンドはDBCC MEMORYSTATUS
、Microsoft サポートの診断ツールを目的としています。 出力の形式と提供される詳細レベルは、サービス パックと製品リリースの間で変更される可能性があります。 コマンドによって DBCC MEMORYSTATUS
提供される機能は、以降の製品バージョンでは別のメカニズムに置き換えられる可能性があります。 したがって、それ以降の製品バージョンでは、このコマンドが機能しなくなった可能性があります。 このコマンドを変更または削除する前に、追加の警告は表示されません。 したがって、このコマンドを使用するアプリケーションは、警告なしで中断する可能性があります。
コマンドの出力は、以前のDBCC MEMORYSTATUS
リリースの SQL Server から変更されました。 現在、以前の製品バージョンでは使用できなかったテーブルがいくつか含まれています。
DBCC MEMORYSTATUS の使用方法
DBCC MEMORYSTATUS
は通常、SQL Serverによって報告されるメモリ不足の問題を調査するために使用されます。 メモリ不足は、SQL Server プロセスの外部からの外部メモリの負荷か、プロセス内で発生する内部圧力がある場合に発生する可能性があります。 内部圧力は、SQL Server データベース エンジン、またはプロセス内で実行される他のコンポーネント (リンク サーバー、IP、SQLCLR、侵入防止、ウイルス対策ソフトウェアなど) によって発生する可能性があります。 メモリ不足のトラブルシューティング方法の詳細については、「SQL Serverでのメモリ不足またはメモリ不足の問題のトラブルシューティング」を参照してください。
コマンドを使用してその結果を解釈するための一般的な手順を次に示します。 特定のシナリオでは、出力に少し異なる方法でアプローチすることが必要になる場合がありますが、全体的なアプローチの概要については、こちらを参照してください。
-
DBCC MEMORYSTATUS
コマンドを実行します。 - [Process/System Counts and Memory Manager]\(プロセス/システム数とメモリ マネージャー\) セクションを使用して、外部メモリの負荷 (たとえば、コンピューターが物理メモリまたは仮想メモリで不足しているか、SQL Serverワーキング セットがページアウトされているかなど) を確立します。 また、これらのセクションを使用して、SQL Server データベース エンジンがシステム上のメモリ全体と比較して割り当てたメモリの量を決定します。
- 外部メモリの負荷が高い場合は、他のアプリケーションや OS によるメモリ使用量を減らすか、RAM を追加してみてください。
- SQL Server エンジンがメモリの大部分 (内部メモリ負荷) を使用していることを確認した場合は、 の
DBCC MEMORYSTATUS
残りのセクションを使用して、このメモリ使用量の最大の要因であるコンポーネント (メモリ クラーク、キャッシュストア、UserStore、または Objectstore) を特定できます。 - 、、
CACHESTORE
USERSTORE
、および の各コンポーネントMEMORYCLEARK
をOBJECTSTORE
調べます。 その Pages Allocated 値を調べて、コンポーネントがSQL Server内で消費しているメモリの量を確認します。 ほとんどのデータベース エンジンのメモリ コンポーネントの簡単な説明については、「 メモリ クラークの種類 」の表を参照してください。- まれに、割り当ては、SQL Server メモリ マネージャーを経由するのではなく、直接仮想割り当てになります。 そのような場合は、割り当てられたページではなく、特定のコンポーネントの下にある VM コミット済み値を調べます。
- コンピューターが NUMA を使用している場合、一部のメモリ コンポーネントはノードごとに分割されます。 たとえば、、
OBJECTSTORE_LOCK_MANAGER (node 1)
、OBJECTSTORE_LOCK_MANAGER (node 2)
、などを観察OBJECTSTORE_LOCK_MANAGER (node 0)
し、最後に でOBJECTSTORE_LOCK_MANAGER (Total)
各ノードの合計値を確認できます。 最初に最適な場所は、合計値を報告するセクションで、必要に応じて内訳を確認します。 詳細については、「 NUMA ノードでのメモリ使用量」を参照してください。
- の一部のセクションでは、特定の
DBCC MEMORYSTATUS
メモリ アロケーターに関する詳細で特殊な情報を提供します。 これらのセクションを使用して、追加の詳細を理解し、メモリ 書記内の割り当ての詳細を確認できます。 このようなセクションの例としては、バッファー プール (データとインデックス キャッシュ)、プロシージャ キャッシュ/プラン キャッシュ、クエリ メモリ オブジェクト (メモリ許可)、最適化キュー、小規模および中規模のゲートウェイ (オプティマイザー メモリ) などがあります。 SQL Serverのメモリの特定のコンポーネントがメモリ不足の原因であることが既にわかっている場合は、その特定のセクションに直接移動することをお勧めします。 たとえば、メモリ エラーを引き起こすメモリ許可の使用率が高い他の方法で確立した場合は、 クエリ メモリ オブジェクト のセクションを確認できます。
この記事の残りの部分では、メモリの問題をより効果的に 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と見なされることを示します。 そのため、 システム物理メモリ の低値は 0 であり、メモリが少ないことを意味します。 同様のロジックは 、[物理メモリの不足を処理 する] と [ 仮想メモリの不足を処理する] に適用されます。ここで、0 は false であることを意味し、1 は true であることを意味します。 この例では、両方の値が 0 です。つまり、SQL Server プロセスには多数の物理メモリと仮想メモリがあります。
メモリ マネージャー
このセクションでは、メモリ マネージャーの出力例を示し、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 コミット済み: この値は、SQL Serverがコミットした仮想メモリ (VM) の全体的な量 (KB 単位) を示します。 つまり、プロセスで使用されるメモリは、物理メモリによってサポートされるか、ページ ファイルによってあまり頻繁にサポートされます。 以前に予約されたメモリ アドレスは、物理ストレージによってサポートされるようになりました。が割り当てられていることを示します。 メモリ内のロックされたページが有効になっている場合、SQL Serverは代替メソッドを使用してメモリを割り当てます。AWE API とほとんどのメモリはこのカウンターに反映されません。 これらの割り当てについては、「割り当てられたロックされたページ](#Locked ページ割り当て済み)」を参照してください。 詳細については、「 VirtualAlloc()、MEM_COMMIT」を参照してください。
[割り当てられたページ]: この値は、データベース エンジンによって割り当てられたメモリ ページの合計数SQL Server示します。
割り当てられたロックされたページ: この値は、AWE API を使用して物理 RAM で割り当ておよびロックSQL Serverメモリの量 (KB 単位) を表します。 これは、SQL Serverがアクティブに使用しているメモリ量を示し、パフォーマンスを最適化するためにメモリに保持するように要求しました。 SQL Serverメモリ内のページをロックすることで、重要なデータベース ページをすぐに使用でき、ディスクにスワップされないようにします。 詳細については、「 アドレス Windows 拡張機能 (AWE) メモリ」を参照してください。 値 0 は、"メモリ内のロックされたページ" 機能が現在無効になっており、代わりに仮想メモリを使用SQL Serverを示します。 このような場合、VM Committed 値は、SQL Serverに割り当てられたメモリを表します。
[割り当てられた大きいページ]: この値は、Large Pages を使用してSQL Serverによって割り当てられたメモリの量を表します。 Large Pages は、オペレーティング システムによって提供されるメモリ管理機能です。 この機能では、標準ページ サイズ (通常は 4 KB) を使用する代わりに、2 MB や 4 MB などのより大きなページ サイズを使用します。 値 0 は、機能が有効になっていないことを示します。 詳細については、「 Virtual Alloc()、MEM_LARGE_PAGES」を参照してください。
[コミットされたターゲット]: この値は、コミットSQL Server目的とするメモリのターゲット量を示します。これは、最近のワークロードに基づいて使用できるメモリSQL Serverの理想的な量です。
現在コミット済み: この値は、SQL Server メモリ マネージャーが現在コミット (物理ストアに割り当てられている) オペレーティング システムのメモリの量 (KB 単位) を示します。 この値には、"メモリ内のロックされたページ" (AWE API) または仮想メモリが含まれます。 そのため、この値は、割り当てられた VM の [コミット済み] または [ロックされたページ] と同じか、またはに近い値になります。 AWE API を使用SQL Server場合、一部のメモリは引き続き OS Virtual Memory Manager によって割り当てられ、VM Committed として反映されることに注意してください。
NUMA 成長フェーズ: この値は、SQL Serverが現在 NUMA 成長フェーズにあるかどうかを示します。 マシン上に NUMA ノードが存在する場合のメモリの初期ランプアップの詳細については、「方法: SQL Server (NUMA ローカル、外部、および離れたメモリ ブロック)」を参照してください。
最後の OS エラー: この値は、システムにメモリ不足があったときに発生した最後の OS エラーを示します。 SQL Serverは、その OS エラーを記録し、出力に表示します。 OS エラーの完全な一覧については、「 システム エラー コード」を参照してください。
NUMA ノードでのメモリ使用量
[メモリ マネージャー] セクションの後に、各メモリ ノードのメモリ使用量の概要が表示されます。 一様でないメモリ アクセス (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
注:
- 値が
Memory node Id
ハードウェア ノード ID に対応していない可能性があります。 - これらの値は、この NUMA ノードで実行されているスレッドによって割り当てられるメモリを示します。 これらの値は、NUMA ノードに対してローカルなメモリではありません。
- すべてのメモリ ノードの VM 予約値と VM Committed 値の合計は、Memory Manager テーブルで報告される対応する値よりもわずかに小さくなります。
- NUMA ノード 64 (ノード 64) は DAC 用に予約されており、この接続では限られたメモリ リソースを使用するため、メモリ調査にはほとんど関心がありません。 専用管理者接続 (DAC) の詳細については、「 データベース管理者の診断接続」を参照してください。
次の一覧では、出力テーブルの値とその説明について説明します。
- 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
値は、特定のコンポーネント (メモリ クラーク、ユーザーストア、オブジェクトストア、またはキャッシュ ストア) によって割り当てられるメモリ ページの総数を示します。
注:
これらのノード ID は、SQL Serverを実行しているコンピューターの NUMA ノード構成に対応します。 ノード ID には、ハードウェア NUMA ノードの上または SMP システムの上に定義されている、可能なソフトウェア NUMA ノードが含まれます。 各ノードのノード ID と CPU 間のマッピングを見つけるには、「Information Event 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 コミット済み: メモリ マップファイル 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 エラーが発生した可能性があるバッファーの数を示します (これは必ずしも問題を示すわけではありません)。
- ページの平均寿命: このカウンターは、最も古いページがバッファー プールに留まった時間を秒単位で測定します。
DMV を使用して、データベース ページのバッファー プールに関する詳細情報を sys.dm_os_buffer_descriptors
取得できます。 ただし、この DMV は長時間実行され、SQL Server ベースのサーバーで大量の RAM を使用できる場合は大きな出力を生成できるため、注意して使用してください。
プラン キャッシュ
このセクションでは、以前にプロシージャ キャッシュと呼ばれていたプラン キャッシュについて説明します。
Procedure Cache Value
----------------------- -----------
TotalProcs 4
TotalPages 25
InUsePages 0
次の一覧では、出力内の値とその説明について説明します。
TotalProcs: この値は、プロシージャ キャッシュに現在キャッシュされているオブジェクトの合計を示します。 この値は、DMV 内のエントリの数と
sys.dm_exec_cached_plans
一致します。注:
この情報の動的な性質上、一致が正確でない可能性があります。 PerfMon を使用すると、SQL Server: プラン キャッシュ オブジェクトと DMV を監視して
sys.dm_exec_cached_plans
、トリガー、プロシージャ、アドホック オブジェクトなど、キャッシュされたオブジェクトの種類に関する詳細情報を確認できます。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 オブジェクトが使用するメモリを示します。 これは、さまざまなサーバー全体の構造に対してストレージ エンジンによって使用されます。
- ロック: ロック マネージャーによって使用されるメモリを示します。
- XDES: トランザクション マネージャーによって使用されるメモリを示します。
- SETLS: スレッド ローカル ストレージ (TLS) を使用するストレージ エンジン固有のスレッドごとの構造体の割り当てに使用されるメモリを示します。 詳細については、「 スレッド ローカル ストレージ」を参照してください。
- SubpDesc Allocators: 並列クエリ、バックアップ操作、復元操作、データベース操作、ファイル操作、ミラーリング、非同期カーソルのサブプロセスの管理に使用されるメモリを示します。 これらのサブプロセスは、"並列プロセス" とも呼ばれます。
- SE SchemaManager: スキーマ マネージャーがストレージ エンジン固有のメタデータを格納するために使用するメモリを示します。
- 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でのメモリ許可によるメモリ不足の問題のトラブルシューティング」を参照してください。
最適化メモリ
クエリは、コンパイルのためにサーバーに送信されます。 コンパイル プロセスには、解析、代数化、最適化が含まれます。 クエリは、コンパイル プロセス中に各クエリが消費するメモリに基づいて分類されます。
注:
この量には、クエリの実行に必要なメモリは含まれません。
クエリが開始されると、コンパイルできるクエリの数に制限はありません。 メモリ消費量が増加し、しきい値に達すると、クエリはゲートウェイを渡して続行する必要があります。 各ゲートウェイの後に、同時にコンパイルされるクエリの制限が徐々に減少しています。 各ゲートウェイのサイズは、プラットフォームと負荷によって異なります。 ゲートウェイ サイズは、スケーラビリティとスループットを最大化するために選択されます。
クエリがゲートウェイを渡すことができない場合は、メモリが使用可能になるまで待機するか、タイムアウト エラー (エラー 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 ゲートウェイが割り当て可能なメモリを超えるメモリがクエリに必要な場合、そのクエリは Medium ゲートウェイに移動し、そのクエリは両方のゲートウェイでユニットを取得したとカウントされます。 クエリに必要なコンパイル メモリの量が多いほど、ゲートウェイ内の構成済みユニットは少なくなります。
-
使用可能なユニット - 構成されたユニットの一覧から同時実行クエリがコンパイルできるスロットまたはユニットの数を示します。 たとえば、32 ユニットを使用できるが、現在 3 つのクエリでコンパイル メモリが使用されている場合
Available Units
、32 から 3、または 29 単位になります。 - 取得 - コンパイルするクエリによって取得されたユニットまたはスロットの数を示します。 現在、3 つのクエリがゲートウェイからのメモリを使用している場合は、Acquires = 3 です。
- ウェイター - ゲートウェイでコンパイル メモリを待機しているクエリの数を示します。 ゲートウェイ内のすべてのユニットが使い果たされた場合、待機中のクエリの数を示す Waiters 値は 0 以外です。
- しきい値 - クエリがどこからメモリを取得するか、どのゲートウェイに留まるかを決定するゲートウェイ メモリ制限を示します。 クエリがしきい値を超える必要がない場合は、小さなゲートウェイにとどまります (クエリは常に小さなゲートウェイで始まります)。 コンパイルのためにより多くのメモリが必要な場合は、中程度のメモリに移動し、そのしきい値がまだ不十分な場合は、大きなゲートウェイに移動します。 小規模ゲートウェイの場合、x64 プラットフォームのしきい値係数は 380,000 バイト (将来のバージョンでは変更される可能性があります) です。
- しきい値係数: 各ゲートウェイのしきい値を決定します。 小さいゲートウェイの場合、しきい値は定義済みであるため、係数も同じ値に設定されます。 中規模ゲートウェイとビッグ ゲートウェイのしきい値係数は、オプティマイザー メモリ全体 (最適化キュー内のメモリ全体) の割合であり、それぞれ 12 と 8 に設定されます。 そのため、他のSQL Serverメモリ コンシューマーがメモリを必要とするため、メモリ全体が調整された場合、しきい値の要因によってしきい値も動的に調整されます。
-
タイムアウト: クエリがオプティマイザー のメモリを待機する時間を定義する値を分単位で示します。 このタイムアウト値に達すると、セッションは待機を停止し、エラー 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