サーバー メモリの構成オプション

適用対象 SQL Server

SQL Server データベース エンジンのメモリ使用率は、構成設定、[min server memory (MB)][max server memory (MB)] のペアによって制限されます。 通常の環境で時間が経過すると、SQL Server は[max server memory (MB)] によって設定された上限までメモリの要求を試みます。

Note

列ストア インデックス: 概要インメモリ OLTP 概要と使用シナリオ オブジェクトには独自のメモリ クラークがあるため、バッファー プールの使用状況を簡単に監視できます。 詳しくは、sys.dm_os_memory_clerks に関する記事をご覧ください。

以前のバージョンの SQL Server では、事実上、メモリ使用率の上限が設定されていませんでした。つまり、SQL Server ですべてのシステム メモリが使用できていました。 すべてのバージョンの SQL Server で [最大サーバー メモリ (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 の設定に関する記事を参照してください。

推奨事項

これらのオプションの既定の設定と最小許容値は次のとおりです。

オプション Default 最小許容値 推奨
[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 の単一インスタンスと、同じホストの他の SQL Server インスタンスでメモリの競合が発生することがあります。
  • ただし、[max server memory (MB)] の設定が低すぎるとパフォーマンスが低下し、SQL Server インスタンスのメモリ不足とパフォーマンスの問題が発生する可能性があります。
  • [max server memory (MB)] を最小値に設定すると、SQL Server が起動できなくなることもあります。 このオプションの変更後に SQL Server を起動できなくなった場合は、-f 起動オプションを使用して起動し、[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 Memory Manager で使用できる最小メモリ量を確保できます。

  • SQL Server は、[min server memory (MB)] で指定されたメモリ量を起動時にすぐに割り当てるわけではありません。 ただし、クライアントの負荷によってメモリの使用量がこの値に達すると、SQL Server は[min server memory (MB)] の値を小さくしない限り、メモリを解放できません。 たとえば、SQL Server の複数のインスタンスが同じサーバーに同時にインストールされている場合は、インスタンスのメモリを予約するように [mix server memory (MB)] パラメーターを設定することを検討してください。

  • 基礎をなすホストからのメモリ負荷が高いために、ゲスト仮想マシン (VM) のバッファー プールから十分なパフォーマンスに必要な量を超えるメモリが割り当て解除される事態を回避するために、[min_server_memory (MB)] 値の設定は仮想環境で必要不可欠となります。 仮想マシン内の SQL Server のインスタンスは、仮想ホストのプロアクティブ メモリ割り当て解除プロセスと競合しないことが理想的です。

  • SQL Server は、[min server memory (MB)] で指定されたメモリ量を必ず割り当てるわけではありません。 サーバーの負荷が [min server memory (MB)] で指定されたメモリ量の割り当てを必要としない場合、SQL Server はより少ないメモリで実行します。

max server memory

[max server memory (MB)] を使用して、OS やその他のアプリケーションが SQL Server からメモリの悪影響を受けないようにします。

  • [max server memory (MB)] 構成を設定する前に、通常の操作中に SQL Server インスタンスをホストしているサーバーの全体的なメモリ消費量を監視して、メモリの可用性と要件を判断します。 初期構成の場合、または SQL Server プロセスのメモリ使用量を長期にわたって収集することがなかった場合は、次の一般的なベスト プラクティスのアプローチを使用して、1 つのインスタンスに対する [max_server_memory (MB)] を構成します。
    • 合計の OS メモリから、[max server memory (MB)] で制御されない、潜在的な SQL Server スレッドのメモリ割り当ての相当分 (スタック サイズ1 * 計算された最大ワーカー スレッド2) を差し引きます。
    • 次に、バックアップ バッファー、拡張ストアド プロシージャ DLL、オートメーション プロシージャ (sp_OA 呼び出し) を使って作成されたオブジェクト、リンク サーバー プロバイダーからの割り当てなど、max server memory (MB) で制御されないその他のメモリ割り当て分として 25% を差し引きます。 これは一般的な概算値であり、実際は異なる場合があります。
    • 残ったものが単一インスタンス セットアップの [max_server_memory (MB)] 設定になります。

1 アーキテクチャあたりのスレッド スタック サイズについては、「メモリ管理アーキテクチャ ガイド」を参照してください。

2 現在のホストで関連付けられている所与の CPU 数に対して計算される既定のワーカー スレッドについては、ドキュメント ページの「max worker threads (サーバー構成オプション)の構成」方法を参照してください。

オプションの手動設定

サーバー オプションの [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) は省略できます。

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
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 Memory Manager によって管理されるメモリ量をメガバイト単位で再構成します。

  1. オブジェクト エクスプローラーで、サーバーを右クリックし、 [プロパティ] をクリックします。

  2. [サーバーのプロパティ] ウィンドウの [メモリ] ページを選択します。 [minimum server memory][maximum server memory] の現在の値が表示されます。

  3. [サーバー メモリ オプション] で、[minimum server memory][maximum server memory] に希望の数値を入力します。 推奨事項については、この記事の「min server memory (MB)」と「max server memory (MB)」を参照してください。

次のスクリーンショットは、3 つの手順すべてを示したものです。

SSMS でのメモリ構成オプションのスクリーンショット。

Lock pages in memory (LPIM)

Windows ベースのアプリケーションでは、Windows アドレス ウィンドウ拡張機能 (AWE) API を使用して、物理的なメモリを割り当ててプロセス アドレス空間にマップできます。 LPIM Windows ポリシーにより、この API にアクセスして物理メモリにデータを保持できるアカウントを指定し、ディスク上の仮想メモリへのデータのページングを防止します。 AWE を使用して割り当てられたメモリは、アプリケーションによって明示的に解放されるか、アプリケーションが終了するまでロックされます。 64 ビット SQL Server でのメモリ管理に AWE API を使用することは、多くの場合、"ロックされたページ" とも呼ばれます。 メモリ内のページをロックすると、ディスクへのメモリのページングが発生した際に、サーバーの応答性を維持できます。 SQL Server Standard エディション以上のインスタンスでは、sqlservr.exe の実行権限があるアカウントに Windows の [Lock pages in memory] (LPIM) ユーザー権利が付与されている場合、[Lock pages in memory] オプションは [有効] に設定されます。

SQL Server の [Lock pages in memory] オプションを無効にするには、sqlservr.exe (SQL Server 開始アカウント) 開始アカウントを実行する特権のあるアカウントに関して、[Lock pages in memory] ユーザー権利を削除します。

LPIM を使っても、SQL Server 動的メモリ管理には影響が出ません。他のメモリ クラークの要求で拡大縮小できます。 [メモリ内のページをロックする] ユーザー権利を使用する場合は、[最大サーバー メモリ (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: ##%.

システム内の他のメモリ コンシューマーを考慮していない、不適切に構成された [最大サーバー メモリ (MB)] 設定で LPIM を使用すると、他のプロセスに必要なメモリの量や、[最大サーバー メモリ (MB)] の適用範囲外の SQL Server メモリ要件によっては、動作が不安定になる可能性があります。 詳細については、max server memory に関する説明を参照してください。 [Lock pages in memory] (LPIM) 権限が (32 ビットまたは 64 ビット システムで) 付与されている場合は、既定の 2,147,483,647 メガバイト (MB) のままにするのではなく、[max server memory (MB)] を特定の値に設定することを強くお勧めします。

Note

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 omn
    INNER JOIN sys.dm_os_nodes 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) は省略できます。

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
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)';