SQL Server で仮想メモリが不足して多数のデータベースを保持できないことがある

文書翻訳 文書翻訳
文書番号: 316749 - 対象製品
すべて展開する | すべて折りたたむ

現象

デフォルトの構成値を使用して Microsoft SQL Server を実行している場合、以下のすべての条件に該当していると、SQL Server プロセスで使用できる仮想アドレス空間が不足することがあります。
  • サーバーに 2 GB 以上の RAM がある。
  • システムに大量のデータベースがある (たとえば、500 以上)。
  • データベースの多くが更新されるデータベースである (たとえば、"読み取り専用" ではないデータベース)。
  • SQL Server の 255 のワーカー スレッドのほとんどを使用するほどの多数のユーザー接続が同時に行われている。
SQL Server で 2 GB の仮想アドレス空間が使い果たされた場合 (または、Boot.ini ファイルで /3GB スイッチを設定していて SQL Server Enterprise Edition で 3 GB の仮想アドレス空間が使い果たされた場合)、次のエラー メッセージが表示されることがあります。

メッセージ 1

エラー : 17802、レベル : 18、状態 : 3
サーバー イベント スレッドの作成に失敗しました。

メッセージ 2

SQL Server が process_loginread スレッドを起動できません。

メッセージ 3

警告: Clearing procedure cache to free contiguous memory.

Buffer Distribution: Stolen=3454 Free=2540 Procedures=138
Inram=0 Dirty=1108 Kept=35
I/O=0, Latched=0, Other=214821
Buffer Counts: Committed=222096 Target=222096 Hashed=215964
InternalReservation=547 ExternalReservation=0 Min Free=512
Procedure Cache: TotalProcs=8 TotalPages=138 InUsePages=138
Dynamic Memory Manager: Stolen=3556
OS=497 General=1706
Query Plan=755 Optimizer=0
Utilities=9 Connection=1583
Global Memory Objects: Resource=1119 Locks=163 XDES=1 SQLCache=90 Replication=5 LockBytes=2 ServerGlobal=20
Query Memory Manager: Grants=0 Waiting=0 Maximum=164370 Available=164370

原因

SQL Server では、ログ レコードをディスクに書き込む前に、ログ レコードの書式設定で使用するために、更新されたデータベースごとに 64 KB のブロックが少なくとも 1 つ割り当てられます。この割り当ては、INSERT、UPDATE、または DELETE の各ステートメントなどでデータベースの最初のログ レコードが生成されたときに行われます。データベースのアクティビティと生成されたログ レコードのサイズによっては、その後の変更によりさらに 64 KB のブロックが割り当てられることがあります。SQL Server 7.0 では、54 KB のブロック 3 つを超えて割り当てが行われることはありません。SQL Server 2000 では、各データベースに対する割り当ての最大数は、SQL Server で使用するように構成されているプロセッサ数に依存します。

回避策

確保されていない仮想メモリを、これらのデータベース割り当てに追加で使用できるようにするには、起動時のパラメータ -g を使用します。-g パラメータについては、SQL Server 7.0 Service Pack の Readme.txt および SQL Server 2000 Books Online に記載されています。この資料の「詳細」には、適切な設定値を決定するのに役立つように、マイクロソフトで推奨している設定値を記載しています。

詳細

2 GB 以上の RAM を搭載したコンピュータでは、256 MB (SQL Server 7.0) または 384 MB (SQL Server 2000) の仮想アドレス空間以外のすべてのメモリが、バッファ プールで使用できるように SQL Server によって起動処理中に確保されます。さらに、データおよびプロシージャ キャッシュを格納するために、SQL Server ではバッファ プール メモリを使用して、SQL Server プロセスから 8 KB 未満のその他のほとんどのメモリ要求が処理されます。確保されないメモリを残すのは、バッファ プールを使用して処理できない他の割り当てに使用するためです。そのような割り当ての一部を以下に示します。
  • スタックおよび SQL Server によって作成されるスレッドに関連付けられたスレッド環境ブロック。SQL Server によって 255 のすべてのワーカー スレッドが作成されると、約 140 MB が割り当てられます。
  • SQL Server アドレス空間で実行されている他の DLL またはプロセスによって行われる割り当て (システムによって異なります)。以下に例を示します。
    • 任意のリンク サーバーの OLE DB プロバイダ
    • sp_OA システム ストアド プロシージャまたは拡張ストアド プロシージャを使用して読み込まれる COM オブジェクト
  • アドレス空間に読み込まれる任意のイメージ (.exe または .dll)。通常、20 〜 25 MB を使用しますが、リンク サーバー、sp_OA、または拡張ストアド プロシージャを使用している場合はそれよりも多くなる可能性があります。
  • プロセス ヒープおよび SQL Server によって作成される可能性があるその他すべてのヒープ。起動処理中には通常 10 MB ですが、リンク サーバー、sp_OA、または拡張ストアド プロシージャを使用している場合はそれよりも多くなる場合があります。
  • 大きなクエリ プランに必要なメモリ割り当て、ネットワーク パケット サイズ構成オプションが 8 KB に近い場合の送信バッファや受信バッファなど、8 KB を超える SQL Server プロセスからの割り当て。この数値を確認するには、DBCC MEMORYSTATUS で 8 KB のページ数として報告される OS Reserved 値を探します。通常の値は、5 MB です。
  • バッファ プール内の各バッファの状態情報を追跡する配列。AWE (Address Windowing Extensions) を有効にして SQL Server を実行していない限り、通常、約 20 MB が割り当てられます。AWE を有効にしている場合は著しく多くなります。
多数のデータベースが存在するシステムで、ログの書式設定に必要な 64 KB の割り当てにより、残りのすべての仮想メモリが占有される場合があります。このときに、後続の割り当てが失敗し、この資料の「現象」に記載されている 1 つ以上のエラーが発生することがあります。

起動時のパラメータ -g を使用することにより、これらのログ関連の割り当てとその他の通常の割り当ての両方で仮想アドレス空間が不足しないように、追加の仮想メモリを残しておくように指定することができます。

-g の値として最初に指定してみるための推奨値のいくつかを、データベースの数およびサーバーのバージョンごとに、以下に示します。
元に戻す全体を表示する
データベース SQL Server 7.0 SQL Server 2000
250 -g134 N/A
500 -g185 N/A
750 -g237 N/A
1000 -g288-g288
1250 -g340-g340
1500 -g392-g392

上記の表は、記載されている一般的な値を使用して計算されました。その際、リンク サーバーのアクティビティがなく、sp_OA および拡張ストアド プロシージャが使用されていないことを前提としています。また、AWE および SQL プロファイラも使用されていないことを前提としています。これらの条件のいずれかに該当していると、-g の値を大きくすることが必要な場合があります。

システム上でさらに多くのデータベースを使用する場合、必要なオーバーヘッドが増大して、バッファ プールから仮想メモリが大量に消費され、システム全体のパフォーマンスが低下する可能性があるため、より多くのデータベースをサーバーで実行する場合は、事前に十分に検討することを推奨します。

さらに、多数のデータベースを作成した場合に、仮想メモリに最も大きな影響を与えます。また、データベースごとのメモリ割り当てが原因で、バッファ プールがメモリ不足の状態になる場合もあります。たとえば、次のエラー メッセージが表示されることがあります。
エラー : 701、レベル : 17、状態 : 123。
このクエリを実行するには、システム メモリが不足しています。
SQL Server 2005 では、データベースごとのメタデータが以前のバージョンの SQL Server よりも多く追跡されるため、このようなメモリ不足の状態は SQL Server 2005 で頻繁に発生することがあります。

sys.dm_db_index_usage_stats ストアド プロシージャを使用してインデックス使用状況を追跡すると大量のメモリが必要になる場合があります。各データベースに多数のインデックスが存在する場合、この操作には大量のメモリが必要です。

プロパティ

文書番号: 316749 - 最終更新日: 2007年4月23日 - リビジョン: 11.1
この資料は以下の製品について記述したものです。
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Standard Edition
キーワード:?
kberrmsg kbtshoot kbnofix kbprb KB316749
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com