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

2 つのサーバー メモリ オプション (最小サーバー メモリ最大サーバー メモリ) を使用して、SQL Serverのインスタンスによって使用されるSQL Server プロセス用に、SQL Server Memory Manager によって管理されるメモリの量 (メガバイト単位) を再構成します。

最小サーバー メモリの既定の設定は 0 で、最大サーバー メモリの既定の設定は 2147483647 MB です。 既定では、SQL Server は、利用可能なシステム リソースに基づきメモリ要件を動的に変更できます。

Note

最大サーバー メモリを最小値に設定すると、SQL Serverパフォーマンスが大幅に低下し、起動を妨げる可能性があります。 このオプションの変更後に SQL Server を起動できなくなった場合は、-f 起動オプションを使用して起動し、max server memory を元の値に戻します。 詳細については、「 データベース エンジン サービスのスタートアップ オプション」を参照してください。

メモリを動的に使用する場合、 SQL Server はシステムに定期的にクエリして、メモリの空き容量を確認します。 このようにメモリの空き容量を維持することによって、オペレーティング システム (OS) のページングが防止されます。 空きメモリが少ない場合、 SQL Server は OS に対してメモリを解放します。 空きメモリが多い場合、 SQL Server はより多くのメモリを割り当てることができます。 SQL Server によってメモリが追加されるのは、ワークロードが高いためにメモリを増やす必要がある場合だけです。アクティブでないサーバーの仮想アドレス空間のサイズは増えません。

現在使用されているメモリを返すクエリについては、例 B を参照してください。 max server memory は、バッファー プール、コンパイル メモリ、すべてのキャッシュ、qe メモリ許可、ロック マネージャー メモリ、clr メモリ (基本的にsys.dm_os_memory_clerksにあるメモリ クラーク) を含む、SQL Serverメモリ割り当てを制御します。 スレッド スタック、メモリ ヒープ、SQL Server以外のリンク サーバー プロバイダー、および非SQL Server DLL によって割り当てられたメモリのメモリは、最大サーバー メモリによって制御されません。

SQL Server では、メモリ通知 API QueryMemoryResourceNotification を使用して、いつ SQL Server Memory Manager がメモリの割り当てまたは解放を行うことができるかを判断します。

SQL Serverでメモリを動的に使用することをお勧めします。ただし、メモリ オプションを手動で設定し、SQL Serverがアクセスできるメモリの量を制限できます。 SQL Serverのメモリ量を設定する前に、物理メモリの合計から、OS に必要なメモリとSQL Serverのその他のインスタンスを減算して、適切なメモリ設定を決定します (コンピューターが完全にSQL Server専用でない場合は、他のシステムが使用します)。 この違いは、SQL Serverに割り当てることができるメモリの最大量です。

メモリ オプションの手動設定

サーバー オプションの min server memorymax server memory を設定して、メモリ範囲を与えることができます。 この方法は、システム管理者またはデータベース管理者が同じホスト上で実行する他のアプリケーションまたは SQL Server の他のインスタンスに必要なメモリと合わせて SQL Server のインスタンスを構成する場合に便利です。

Note

min server memory および max server memory は拡張オプションです。 sp_configure システム ストアド プロシージャを使用してこれらの設定を変更するには、 show advanced options を 1 に設定する必要があります。 これらの設定は、サーバーを再起動しなくてもすぐに有効になります。

min_server_memory を使用すると、SQL Server インスタンス用に SQL Server Memory Manager で使用できる最小メモリ量を確保できます。 SQL Server は、 min server memory で指定されたメモリ量を起動時にすぐに割り当てるわけではありません。 ただし、クライアントの負荷によってメモリの使用量がこの値に達すると、 SQL Server min server memory の値を小さくしない限り、 はメモリを解放できません。 たとえば、SQL Server の複数のインスタンスが同じホストに同時に存在するとき、インスタンスのメモリを予約する目的で、max_server_memory の代わりに min_server_memory パラメーターを設定します。 また、基礎をなすホストからのメモリ負荷が高いために、ゲスト SQL Server 仮想マシン (VM) のバッファー プールから十分なパフォーマンスに必要な量を超えるメモリが割り当て解除される事態を回避するために、min_server_memory 値の設定は仮想環境で必要不可欠となります。

注意

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

max_server_memory を利用し、OS に好ましくないメモリ負荷が発生しないようにします。 最大サーバー メモリ構成を設定するには、メモリ要件を判断する目的で、SQL Server の全体的使用量を観察します。 単一インスタンスでこのような計算をより精確に行うには:

  • OS のメモリ合計から、1GB ~ 4GB を OS 自体に予約します。
  • 次に、最大サーバー メモリ 制御の外部にある潜在的なSQL Serverメモリ割り当てと同等のメモリ割り当てを減算します。これは、スタック サイズ 1 * 計算された最大ワーカー スレッド 2 + -g スタートアップ パラメーター 3 (-g が設定されていない場合は既定では 256 MB) で構成されます。 残ったものが単一インスタンス セットアップの max_server_memory 設定になります。

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

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

3 スタートアップ パラメーター -g の詳細については、ドキュメント ページの「データベース エンジン サービスのスタートアップ オプション」を参照してください。 32 ビット SQL Server (SQL Server 2005 ~ SQL Server 2014) にのみ適用できます。

OS の種類 最大サーバー メモリに対して許容される最小メモリ
32 ビット 64 MB
64 ビット 128 MB

SQL Server Management Studio を使用して、メモリ オプションを構成する方法

min server memory および max server memoryの 2 つのサーバー メモリ オプションを使用して、SQL Server のインスタンス用に SQL Server Memory Manager によって管理されるメモリ量を MB 単位で再構成します。 既定では、 SQL Server は使用可能なシステム リソースに基づいて、必要なメモリを動的に変更できます。

固定量のメモリを構成する手順

固定量のメモリを設定するには:

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

  2. [メモリ] ノードをクリックします。

  3. [サーバー メモリ オプション] で、 [最小サーバー メモリ][最大サーバー メモリ] に必要な数値を入力します。

    既定の設定を使用すると、 SQL Server が使用できるシステム リソースに基づいて、そのメモリ要求を動的に変更できるようになります。 最小サーバー メモリの既定の設定は 0 で、最大サーバー メモリの既定の設定は 2147483647 メガバイト (MB) です。

ネットワーク アプリケーションのデータ スループットの最大化

SQL Serverのシステム メモリの使用を最適化するには、システムがファイル キャッシュに使用するメモリの量を制限する必要があります。 ファイル システム キャッシュを制限するには、 [ファイル共有のデータ スループットを最大にする] が選択されていないことを確認します。 最小のファイル システム キャッシュを指定するには、 [メモリの使用を最小にする] または [バランスをとる]を選択します。

オペレーティング システムの現在の設定を確認するには

  1. [スタート]ボタンをクリックし、 [コントロール パネル]をクリックします。次に [ネットワーク接続]をダブルクリックして、 [ローカル エリア接続]をダブルクリックします。

  2. [全般] タブで [プロパティ]をクリックし、 [Microsoft ネットワーク用ファイルとプリンター共有]を選択して、 [プロパティ]をクリックします。

  3. [ネットワーク アプリケーションのデータ スループットを最大にする] が選択されている場合は、他のオプションを選択して [OK]をクリックし、すべてのダイアログ ボックスを閉じます。

lock pages in memory

この Windows ポリシーにより、プロセスを使用して物理メモリにデータを保持できるアカウントを指定し、ディスク上の仮想メモリへのデータのページングを防止します。 メモリ内のページをロックすると、ディスクへのメモリのページングが発生した際に、サーバーの応答性を維持できます。 SQL Serverメモリ内のページのロック オプションは、sqlservr.exeを実行する権限を持つアカウントに Windows の "Locked Pages in Memory" (LPIM) ユーザー権利が付与されている場合、SQL Server 2014 Standard エディション以降の 32 ビットおよび 64 ビット インスタンスでは ON に設定されます。 それよりも前のバージョンの SQL Server の場合、SQL Server の 32 ビット インスタンスで Lock Pages オプションを設定するには、sqlservr.exe の実行権限があるアカウントに LPIM のユーザー権利があること、さらに、'awe_enabled' 構成オプションがオンに設定されていることが必要となります。

SQL Serverの [メモリ内のページのロック] オプションを無効にするには、SQL Serverスタートアップ アカウントの "メモリ内のロックされたページ" ユーザー権限を削除します。

Lock Pages in Memory を無効にするには

メモリ内のロック ページ オプションを無効にするには:

  1. [スタート] メニューの [ファイル名を指定して実行] をクリックします。 [ 開く ] ボックスに「」と入力します gpedit.msc

    [グループ ポリシー] ダイアログ ボックスが開きます。

  2. [グループ ポリシー] コンソールで [コンピューターの構成] を展開し、次に [Windows の設定] を展開します。

  3. [セキュリティの設定] を展開し、 [ローカル ポリシー] を展開します。

  4. [ユーザー権利の割り当て] フォルダーをクリックします。

    ポリシーが詳細ペインに表示されます。

  5. 詳細ペインで、 [メモリ内のページのロック] をダブルクリックします。

  6. [ローカル セキュリティ ポリシーの設定] ダイアログ ボックスで、sqlservr.exe の実行権限のあるアカウントを選択し、 [削除]をクリックします。

仮想メモリ マネージャー

32 ビット オペレーティング システムでは、4 GB の仮想アドレス空間にアクセスできます。 仮想メモリの 2 GB はプロセスごとに専有され、アプリケーションで使用できます。 残りの 2 GB はオペレーティング システムが使用するために予約されています。 すべてのオペレーティング システムのエディションには、オペレーティング システム用の仮想メモリを 1 GB に制限して、アプリケーションで 3 GB の仮想アドレス空間にアクセスできるようにするスイッチが含まれています。 スイッチのメモリ構成の使用方法については、4 GB チューニング (4GT) に関する Windows のマニュアルを参照してください。 32 ビット SQL Serverが 64 ビット オペレーティング システムで実行されている場合、ユーザーが使用できる仮想アドレス空間は完全な 4 GB です。

Windows 仮想メモリ マネージャー (VMM) は、使用可能な物理メモリにコミット済みのアドレス空間をマップします。

さまざまなオペレーティング システムでサポートされている物理メモリ量の詳細については、Windows のマニュアルの「Windows のリリース別のメモリ制限」を参照してください。

仮想メモリ システムでは、仮想メモリと物理メモリの比率が 1:1 を超えるような物理メモリの設定を許可しています。 その結果、さまざまな物理メモリ構成のコンピューターで大規模なプログラムを実行できます。 しかし、すべてのプロセスの平均ワーキング セットを合わせた容量よりもはるかに大きな仮想メモリを使用すると、パフォーマンスが低下する可能性があります。

min server memory および max server memory は拡張オプションです。 sp_configure システム ストアド プロシージャを使用してこれらの設定を変更するには、 show advanced options を 1 に設定する必要があります。 これらの設定は、サーバーを再起動しなくてもすぐに有効になります。

SQL Server の複数インスタンスの実行

データベース エンジンの複数のインスタンスを実行する場合は、3 つの方法でメモリを管理できます。

  • max server memory を使用して、メモリ使用量を制御します。 許可する値の合計がコンピューターの合計物理メモリを超えないように注意して、各インスタンスの最大値を設定します。 予測されるワークロードまたはデータベース サイズに比例して、各インスタンスにメモリを割り当てることができます。 この方法の利点は、新しいプロセスまたはインスタンスが起動したときに、直ちに空きメモリを使用できることです。 欠点は、実行していないインスタンスがある場合、残っている空きメモリを実行中のインスタンスが利用できないことです。

  • min server memory を使用して、メモリ使用量を制御します。 最小値の合計がコンピューターの合計物理メモリよりも 1 ~ 2 GB 少なくなるように、各インスタンスの最小値を設定します。 この場合も、インスタンスの予測される負荷に比例して、最小値を設定できます。 この方法の利点は、一度にすべてのインスタンスを実行しない場合に、実行中のインスタンスが残っている空きメモリを使用できることです。 また、この方法は、コンピューターの別のプロセスがメモリを集中的に使用する場合にも有効です。少なくとも、妥当なメモリ量を SQL Server が使用できることが保証されます。 欠点は、新しいインスタンス (または他のプロセス) が起動するときに、実行中のインスタンスがメモリを解放するのにしばらく時間がかかる場合があることです。特に、変更されたページをデータベースに書き戻す必要がある場合は時間がかかります。

  • 何も行いません (非推奨)。 ワークロードを伴う最初のインスタンスに、すべてのメモリが割り当てられる傾向があります。 アイドル状態のインスタンスまたは後から起動したインスタンスは、使用可能な最小限のメモリ量だけで実行することになります。 SQL Server は、インスタンス間でメモリ使用量の調整を図ることはありません。 ただし、すべてのインスタンスは、Windows の Memory Notification シグナルに対応して、メモリ使用量を調整します。 Memory Notification API を使用して Windows がアプリケーション間のメモリを調整することはありません。 システムで使用できるメモリに関するグローバルなフィードバックを提供するだけです。

これらの設定はインスタンスを再起動しなくても変更できるので、簡単にいろいろな設定を試して、使用パターンに最適な設定を見つけることができます。

SQL Server に対する最大メモリ容量の指定

32 ビット 64 ビット
コンベンショナル メモリ すべてのSQL Serverエディションで仮想アドレス空間の制限を処理するまで:

2 GB

/3 gb ブート パラメーターを使用 して 3 GB *

WOW64 で 4 GB**
すべてのSQL Serverエディションで仮想アドレス空間の制限を処理するまで:

8 TB (x64 アーキテクチャの場合)

*/3gb はオペレーティング システムのブート パラメーターです。 詳細については、 MSDN ライブラリを参照してください。

**WOW64 (Windows 64 上の Windows) は、32 ビット SQL Serverが 64 ビット オペレーティング システムで実行されるモードです。 詳細については、 MSDN ライブラリを参照してください。

例 A

次の例では、 max server memory オプションを 4 GB に設定します。

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'max server memory', 4096;  
GO  
RECONFIGURE;  
GO  

例 B: 現在のメモリ割り当てを確認する

次のクエリでは、現在割り当てられているメモリに関する情報を返します。

SELECT  
(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB,  
(locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB,  
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,  
process_physical_memory_low,  
process_virtual_memory_low  
FROM sys.dm_os_process_memory;  

参照

パフォーマンスの監視とチューニング
RECONFIGURE (Transact-SQL)
サーバー構成オプション (SQL Server)
sp_configure (Transact-SQL)