web-dev-qa-db-ja.com

SQL Serverからのメモリの再利用

私はSQL Serverのインスタンスを使用していますが、Windowsでメモリが使用できなくなるまで、メモリ使用量は徐々に増加します。ときどき大きなクエリ結果が発生してインスタンスが大きくなるのは当然のようです。

SQL Serverに、必要のないメモリを解放するように説得する方法はありますか(サービスの再起動以外)。

編集:
SQL Server 2000 SQL Server 8.00.2039-SP4(Standard Edition)を使用しています

私は次のクエリを使用してそれを見つけることができました:

SELECT 'SQL Server ' 
    + CAST(SERVERPROPERTY('productversion') AS VARCHAR) + ' - ' 
    + CAST(SERVERPROPERTY('productlevel') AS VARCHAR) + ' (' 
    + CAST(SERVERPROPERTY('edition') AS VARCHAR) + ')'
10
BIBD

だから、答えを要約するには:

MS SQL Serverがすぐに必要としないメモリを解放するように指示する方法はありません。 SQL Serverは必要に応じて自動的にメモリを解放する必要がありますが、その前ではありません。また、メモリに問題がある場合は、「最大サーバーメモリ」のメモリオプチンの値を減らす必要があります。

4
BIBD

これは、SQL Serverの動作が想定されているとまったく同じです。

そのマシンに他のサービスがあり、SQLが使用可能なすべてのメモリを消費しないようにするには、最大サーバーメモリを設定する必要があります。 MSDNの SQL Serverメモリオプション を参照してください。

19
Portman

他のポスターはこれが仕様によるものであることが正しいですが、最大メモリをサーバーのRAMよりも少し少なく制限する必要があります。この一連のイベントについて考えてみましょう。

  • SQL 2000は問題なく実行され、サーバーのすべてのRAMを消費します
  • 誰かがRDPを使用している、またはプルアップする必要があるIEパッチをダウンロードする、またはバックアップを開始する
  • SQLは、OSが機能するために十分なメモリを割り当て解除して解放する必要があります
  • メモリを解放してディスクにページングしているときにパフォーマンスが低下する
  • 安定したら問題はありません
  • 他の操作が完了し、SQLは解放されたRAMを徐々に再利用します
  • 繰り返す

これを回避するには、サーバーの最大メモリ制限を実際の物理メモリの約80〜90%に構成します。 SQL 2000の手順: http://msdn.Microsoft.com/en-us/library/ms178067.aspx

8
sh-beta

OSがRAMが不足していることを通知した場合、またはサービスを停止して再起動した場合のみ、それを解放します。実行することは、SQLが使用する最大量を 'maxサーバーのメモリの値です。RAMを必要とするサーバー上に他に何もない場合(そして願わくばそれがない場合)、私はそれについて心配しません。

4
SqlACID

SQL Serverはメモリを消費し、メモリ不足がオペレーティングシステムから通知されない限り、メモリを戻しません。 Portmanが示したように、これは設計によるものであり、メモリ消費を制限したい場合は、SQL Serverが使用する最大サーバーメモリを設定する必要があります。

3
K. Brian Kelley

皆さんが説明している動作はSQL Server 2005以降のものであり、メモリマネージャーが(とりわけ)OSからのメモリプレッシャー要求に応答するように書き換えられたことを思い出してください。

SQL Server 2000以前の場合、メモリを取得すると、OSがどれだけ叫んでも、メモリは返されません。

CodeSlave-2000、2005、または2008で実行していますか?

2
Paul Randal

古い質問ですが、SQLでメモリを解放するように強制する方法は、(少なくとも)SQLをチャンクで割り当て可能な限り多くのメモリを割り当てるアプリケーションを記述し、(たとえば)15秒間待機することです(たとえば、Sleep(15000))。そして、割り当てられたメモリを解放して終了します。私はこれを試しましたが、SQLはメモリを解放するため、システムはRAMを取り戻します。上記のようなコードを書くことは、C/C++を使用してほとんど取るに足らないことです。メモリブロックチェーン(ポインタとサイズ)を保持する構造体のチェーンを設定するだけで、「malloc()」が失敗したときにサイズが徐々に減少し、最小値(たとえば1024未満)、リンクされたリストを走査して、割り当てられたブロックを解放します。

0
A Passer by