適用対象:SQL Server
SQL Server データベース エンジンのメモリ使用率は、 min server memory (MB)
と max server memory (MB)
の構成設定のペアによって制限されます。 時間の経過と通常の状況では、SQL Server は、 max server memory (MB)
によって設定された制限までメモリの要求を試みます。
注
列ストア インデックス: 概要 と In-Memory OLTP の概要と使用シナリオ のオブジェクトには独自のメモリ クラークがあるため、バッファー プールの使用状況を簡単に監視できます。 詳しくは、sys.dm_os_memory_clerks に関する記事をご覧ください。
以前のバージョンの SQL Server では、事実上、メモリ使用率の上限が設定されていませんでした。つまり、SQL Server ですべてのシステム メモリが使用できていました。 すべてのバージョンの SQL Server では、 max server memory (MB)
を構成して SQL Server のメモリ使用率の上限を構成することをお勧めします。
- SQL Server 2019 (15.x) 以降、Windows サーバーでの SQL セットアップでは、インストール時に使用可能なシステム メモリの割合に基づいて、スタンドアロン SQL Server インスタンスの
max server memory (MB)
に関する推奨事項が提供されます。 -
min server memory (MB)
とmax server memory (MB)
構成オプションを使用して、SQL Server のインスタンスによって使用される SQL Server プロセスのメモリの境界 (メガバイト単位) をいつでも再構成できます。
注
このガイドでは、Windows 上の SQL Server インスタンスについて説明します。 Linux でのメモリ構成の詳細については、「SQL Server on Linux のパフォーマンスのベスト プラクティスと構成ガイドライン」と memory.memorylimitmb の設定に関する記事を参照してください。
推奨事項
これらのオプションの既定の設定と最小許容値は次のとおりです。
オプション | 既定値 | 最小許容値 | 推奨 |
---|---|---|---|
min server memory (MB) |
0 | 0 | 0 |
max server memory (MB) |
2,147,483,647 メガバイト (MB) | 128 MB | その他のインスタンスなど、他のプロセスで使用されない使用可能なシステム メモリの 75%。 推奨事項の詳細については、max server memory に関する記事を参照してください。 |
この範囲内で、SQL Server は使用可能なシステム リソースに基づいて、メモリ要件を動的に変更できます。 詳細については、「動的メモリ管理」を参照してください。
-
max server memory (MB)
値が大きすぎると、SQL Server の 1 つのインスタンスが同じホスト上でホストされている他の SQL Server インスタンスとメモリの競合を引き起こす可能性があります。 - ただし、
max server memory (MB)
設定が低すぎるとパフォーマンスが低下し、SQL Server インスタンスでメモリ不足やパフォーマンスの問題が発生する可能性があります。 -
max server memory (MB)
を最小値に設定すると、SQL Server の起動を妨げる場合もあります。 このオプションを変更した後で SQL Server を起動できない場合は、-f
スタートアップ オプションを使用して SQL Server を起動し、max server memory (MB)
を以前の値にリセットします。 詳細については、「データベース エンジン サービスのスタートアップ オプション」を参照してください。 -
max server memory (MB)
とmin server memory (MB)
を同じ値または同じ値の近くに設定することはお勧めしません。
注
最大サーバー メモリ オプションでは、SQL Server バッファー プールのサイズのみが制限されます。 最大サーバー メモリ オプションを使用しても、拡張ストアド プロシージャ、COM オブジェクト、非共有 DLL、EXE などの他のコンポーネントの割り当てのための、SQL Server によって残されている予約されていない残りのメモリ領域を制限することはありません。
SQL Server では、メモリを動的に使用できます。 ただし、手動でメモリ オプションを設定して SQL Server がアクセスできるメモリの量を制限することもできます。 SQL Server のメモリ量を設定する前に、物理メモリの合計、オペレーティング システム (OS) に必要なメモリ、 max server memory (MB)
設定によって制御されないメモリの割り当て、および SQL Server の他のインスタンス (およびサーバーがメモリを消費する他のアプリケーションが存在する場合は他のシステムが使用する) を減算して、適切なメモリ設定を決定します。 SQL Server の他のインスタンスを含む)。 この差が、現在の SQL Server インスタンスに割り当てることができる最大メモリ量です。
SQL Server のすべてのエディションで、プロセス仮想アドレス空間の制限までメモリを構成できます。 詳細については、「Memory Limits for Windows and Windows Server Releases」 (Windows リリースと Windows Server リリースのメモリ上限) を参照してください。
min server memory
min server memory (MB)
を使用して、SQL Server メモリ マネージャーで使用可能な最小メモリ量を保証します。
SQL Server では、起動時に
min server memory (MB)
で指定されたメモリ量はすぐには割り当てられません。 ただし、クライアントの負荷によりメモリ使用量がこの値に達した後は、min server memory (MB)
の値が小さくない限り、SQL Server はメモリを解放できません。 たとえば、SQL Server の複数のインスタンスが同じサーバーに同時にインストールされている場合は、インスタンスのメモリを予約するようにmin server memory (MB)
パラメーターを設定することを検討してください。仮想化環境では、
min server memory (MB)
値の設定は、基になるホストからのメモリ負荷が、許容可能なパフォーマンスに必要な量を超えてゲスト仮想マシン (VM) 上のバッファー プールからメモリの割り当てを解除しないようにするために不可欠です。 仮想マシン内の SQL Server のインスタンスは、仮想ホストのプロアクティブ メモリ割り当て解除プロセスと競合しないことが理想的です。SQL Server は、
min server memory (MB)
で指定されたメモリ量を割り当てる保証はありません。 サーバーの負荷が、min server memory (MB)
で指定されたメモリ量を割り当てる必要がない場合、SQL Server の使用メモリが少なくなります。
max server memory
を使用して、OS やその他のアプリケーションで SQL Server からの有害なメモリ不足が発生しないことを保証します。
-
max server memory (MB)
構成を設定する前に、通常の操作中に、SQL Server インスタンスをホストしているサーバーの全体的なメモリ消費量を監視して、メモリの可用性と要件を決定します。 初期構成の場合、または時間の経過と同時に SQL Server プロセスのメモリ使用量を収集する機会がない場合は、次の一般化されたベスト プラクティスアプローチを使用して、単一インスタンスのmax server memory (MB)
を構成します。- OS メモリの合計から、
max server memory (MB)
コントロール外の SQL Server スレッド メモリ割り当てと同等のメモリ割り当てを減算します。これは、 スタック サイズ1 に 計算された最大ワーカー スレッド2 を乗算した値です。 - 次に、バックアップ バッファー、拡張ストアド プロシージャ DLL、オートメーション プロシージャ (
sp_OA
呼び出し) を使用して作成されたオブジェクト、リンク サーバー プロバイダーからの割り当てなど、max server memory (MB)
コントロール外の他のメモリ割り当てに対して 25% を減算します。 これは一般的な概算値であり、実際は異なる場合があります。 - 残っているのは、1 つのインスタンスセットアップの
max server memory (MB)
設定です。
- OS メモリの合計から、
1 アーキテクチャあたりのスレッド スタック サイズについては、「メモリ管理アーキテクチャ ガイド」を参照してください。
2 現在のホスト内の特定の数のアフィニティ付き CPU に対して計算される既定のワーカー スレッドの詳細については、「 サーバー構成: 最大ワーカー スレッド数」を参照してください。
オプションの手動設定
min server memory (MB)
とmax server memory (MB)
のサーバー オプションは、メモリ値の範囲にまたがって設定できます。 この方法は、システムまたはデータベースの管理者が同じホスト上で実行する他のアプリケーションまたは SQL Server の他のインスタンスに必要なメモリと共に SQL Server のインスタンスを構成する場合に便利です。
Transact-SQL の使用
min server memory (MB)
オプションとmax server memory (MB)
オプションは詳細オプションです。
sp_configure
システム ストアド プロシージャを使用してこれらの設定を変更するには、[show advanced options] を 1 に設定する必要があります。 これらの設定は、サーバーを再起動しなくてもすぐに有効になります。 詳細については、sp_configure に関する記事を参照してください。
次の例では、 max server memory (MB)
オプションを 12,288 MB または 12 GB に設定します。
sp_configure
ではオプションの名前が max server memory (MB)
と指定されますが、(MB)
は省略できます。
EXECUTE sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'max server memory', 12288;
GO
RECONFIGURE;
GO
次のクエリでは、現在構成されている値と現在使用中の値に関する情報が返されます。 このクエリでは、sp_configure
オプション [高度なオプションを表示する] が有効かどうかに関係なく結果が返されます。
SELECT [name],
[value],
[value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)'
OR [name] = 'min server memory (MB)';
SQL Server Management Studio を使用します
min server memory (MB)
とmax server memory (MB)
を使用して、SQL Server のインスタンスの SQL Server メモリ マネージャーによって管理されるメモリの量 (メガバイト単位) を再構成します。
オブジェクト エクスプローラーで、サーバーを右クリックし、 [プロパティ] をクリックします。
[サーバーのプロパティ] ウィンドウの [メモリ] ページを選択します。 [minimum server memory] と [maximum server memory] の現在の値が表示されます。
[サーバー メモリ オプション] で、[minimum server memory] と [maximum server memory] に希望の数値を入力します。 推奨事項については、この記事の「min server memory (MB)」と「max server memory (MB)」を参照してください。
次のスクリーンショットは、3 つの手順すべてを示したものです。
メモリ内のページをロックする (LPIM)
Windows ベースのアプリケーションでは、Windows アドレス ウィンドウ拡張機能 (AWE) API を使用して、物理的なメモリを割り当ててプロセス アドレス空間にマップできます。 LPIM Windows ポリシーにより、この API にアクセスして物理メモリにデータを保持できるアカウントを指定し、ディスク上の仮想メモリへのデータのページングを防止します。 AWE を使用して割り当てられたメモリは、アプリケーションによって明示的に解放されるか、アプリケーションが終了するまでロックされます。 64 ビット SQL Server でのメモリ管理に AWE API を使用することは、多くの場合、"ロックされたページ" とも呼ばれます。 メモリ内のページをロックすると、ディスクへのメモリのページングが発生した際に、サーバーの応答性を維持できます。 SQL Server Standard エディション以上のインスタンスでは、 の実行権限があるアカウントに Windows の [Lock pages in memory] (LPIM) ユーザー権利が付与されている場合、sqlservr.exe
オプションは [有効] に設定されます。
SQL Server の [Lock pages in memory] オプションを無効にするには、 (SQL Server 開始アカウント) 開始アカウントを実行する特権のあるアカウントに関して、sqlservr.exe
ユーザー権利を削除します。
LPIM を使っても、SQL Server 動的メモリ管理には影響が出ません。他のメモリ クラークの要求で拡大縮小できます。
[Lock pages in memory user right]\(メモリ内のページのロック\) を使用する場合は、max server memory (MB)
の上限を設定することを強くお勧めします。 詳細については、「max server memory (MB)」を参照してください。
LPIM は、sqlservr
プロセスがページ アウトされているという兆候があるときに使う必要があります。その場合、次の例のようなエラー 17890 がエラー ログに報告されます:
A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.
システム内の他のメモリ コンシューマーを考慮しない不適切に構成された max server memory (MB)
設定で LPIM を使用すると、他のプロセスで必要なメモリの量や、 max server memory (MB)
の範囲外の SQL Server メモリ要件によっては不安定になる可能性があります。 詳細については、max server memory に関する説明を参照してください。
メモリ内のロック ページ (LPIM) 権限が (32 ビットまたは 64 ビット システムで) 付与されている場合は、既定値の 2,147,483,647 MB (MB) のままにするのではなく、max server memory (MB)
を特定の値に設定することを強くお勧めします。
注
SQL Server 2012 (11.x) 以降では、Standard Edition で Lock Pages を使用するのに トレース フラグ 845 は必要ありません。
[Lock pages in memory] を有効にする
前の情報を考慮した後、SQL Server のインスタンスのサービス アカウントに権限を付与して [Lock pages in memory] オプションを有効にするには、「Lock Pages in Memory オプションの有効化 (Windows)」を参照してください。
SQL Server のインスタンスのサービス アカウントを確認するには、SQL Server 構成マネージャーを参照するか、service_account
のクエリを sys.dm_server_services
から実行します。 詳細については、「sys.dm_server_services」を参照してください。
[Lock pages in memory] の状態を表示する
SQL Server のインスタンスのサービス アカウントに [Lock pages in memory] 権限が付与されているかどうかを確認するには、次のクエリを使用します。 このクエリは、SQL Server 2016 (13.x) SP1 以降でサポートされています。
SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;
次の sql_memory_model_desc
の値は、LPIM の状態を示します。
-
CONVENTIONAL
Lock pages in memory 権限が付与されていません。 -
LOCK_PAGES
Lock pages in memory 権限が付与されています。 -
LARGE_PAGES
Lock pages in memory 権限は、トレース フラグ 834 が有効になっているエンタープライズ モードで付与されます。 これは高度な構成であり、ほとんどの環境では推奨されません。 詳細および重要な注意事項については、トレース フラグ 834 に関する記事を参照してください。
次のメソッドを使用して、SQL Server インスタンスでロックされたページが使用されているかどうかを判断します。
次の Transact-SQL クエリの出力は、
locked_page_allocations_kb
に対して 0 以外の値を示します。SELECT osn.node_id, osn.memory_node_id, osn.node_state_desc, omn.locked_page_allocations_kb FROM sys.dm_os_memory_nodes AS omn INNER JOIN sys.dm_os_nodes AS osn ON (omn.memory_node_id = osn.memory_node_id) WHERE osn.node_state_desc <> 'ONLINE DAC';
現在の SQL サーバー エラー ログは、サーバーの起動時に
Using locked pages in the memory manager
メッセージをレポートします。DBCC MEMORYSTATUS 出力のメモリ マネージャー セクションは、
AWE Allocated
項目に対して 0 以外の値を示します。
複数の SQL Server インスタンス
データベース エンジンの複数のインスタンスを実行する場合は、さまざまな方法でメモリを管理できます。
各インスタンスの
max server memory (MB)
を使用して、 前述のようにメモリ使用量を制御します。 許可する値の合計がコンピューターの合計物理メモリを超えないように注意して、各インスタンスの最大値を設定します。 予測されるワークロードまたはデータベース サイズに比例して、各インスタンスにメモリを割り当てることができます。 この方法の利点は、新しいプロセスまたはインスタンスが起動したときに、直ちに空きメモリを使用できることです。 欠点は、実行していないインスタンスがある場合、残っている空きメモリを実行中のインスタンスが利用できないことです。各インスタンスの
min server memory (MB)
を使用して、 前述のようにメモリ使用量を制御します。 最小値の合計がコンピューターの合計物理メモリよりも 1 から 2 GB 少なくなるように、各インスタンスの最小値を設定します。 この場合も、インスタンスの予測される負荷に比例して、最小値を設定できます。 この方法の利点は、一度にすべてのインスタンスを実行しない場合に、実行中のインスタンスが残っている空きメモリを使用できることです。 また、この方法は、コンピューターの別のプロセスがメモリを集中的に使用している場合にも有効です。少なくとも、妥当なメモリ量を SQL Server が使用できることが保証されます。 欠点は、新しいインスタンス (または他のプロセス) が起動する際に、実行中のインスタンスがメモリを解放するのにしばらく時間がかかる場合があることです。特に、変更されたページをデータベースに書き戻す必要がある場合は時間がかかります。各インスタンスで
max server memory (MB)
とmin server memory (MB)
の両方を使用して、メモリ使用量を制御し、各インスタンスの最大使用率とメモリの最小保護を、潜在的なメモリ使用率レベルの広い範囲で監視および調整します。何も行いません (非推奨)。 ワークロードを伴う最初のインスタンスに、すべてのメモリが割り当てられる傾向があります。 アイドル状態のインスタンスまたは後から起動したインスタンスは、使用可能な最小限のメモリ量だけで実行することになります。 SQL Server は、インスタンス間でメモリ使用量の調整を図ることはありません。 ただし、すべてのインスタンスは、Windows の Memory Notification シグナルに対応して、メモリ使用量を調整します。 Memory Notification API を使用して Windows がアプリケーション間のメモリを調整することはありません。 システムで使用できるメモリに関するグローバルなフィードバックを提供するだけです。
これらの設定はインスタンスを再起動しなくても変更できるので、簡単にいろいろな設定を試して、使用パターンに最適な設定を見つけることができます。
例
A。 [max server memory] オプションを 4 GB に設定する
次の例では、 max server memory (MB)
オプションを 4096 MB または 4 GB に設定します。
sp_configure
ではオプションの名前が max server memory (MB)
と指定されますが、(MB)
は省略できます。
EXECUTE sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
これにより、新しいメモリ制限の実行時Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install.
にすぐに有効になるステートメントがRECONFIGURE
出力されます。 詳細については、sp_configure に関する記事を参照してください。
B. 現在のメモリ割り当てを確認する
次のクエリでは、現在割り当てられているメモリに関する情報を返します。
SELECT physical_memory_in_use_kb / 1024 AS sql_physical_memory_in_use_MB,
large_page_allocations_kb / 1024 AS sql_large_page_allocations_MB,
locked_page_allocations_kb / 1024 AS sql_locked_page_allocations_MB,
virtual_address_space_reserved_kb / 1024 AS sql_VAS_reserved_MB,
virtual_address_space_committed_kb / 1024 AS sql_VAS_committed_MB,
virtual_address_space_available_kb / 1024 AS sql_VAS_available_MB,
page_fault_count AS sql_page_fault_count,
memory_utilization_percentage AS sql_memory_utilization_percentage,
process_physical_memory_low AS sql_process_physical_memory_low,
process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;
C.
max server memory (MB)
の値を確認する
次のクエリでは、現在構成されている値と使用中の値に関する情報が返されます。 このクエリでは、sp_configure
オプション [高度なオプションを表示する] が有効かどうかに関係なく結果が返されます。
SELECT [value], [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)';