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


10

私は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) + ')'

回答:


19

これがまさにSQL Serverが機能するはずの方法です。

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


1
機能というよりはバグのように聞こえます... SQL Serverは、何かを行うために使用可能なRAMの95%を使用し、完了すると解放に失敗します。
錬金術2010年

1
@アルケミカル「完全」の意味に依存します。SQL Server コンピュータのすべてのRAMを利用できます。ディスクキャッシュとして使用します。SQL Serverの使用が完了するまで、ディスクキャッシュとして使用しても「完了」しません。
Ian Boyd

8

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

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

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


この動作は2005年であり、2008〜2000年はOSへの要求に応じてメモリを解放しないことに注意してください。
ポールランダル

2
必ずしもオンデマンドではありませんが、メモリを解放してOSに戻します。私が投稿したリンクから:「SQL Serverがメモリを動的に使用している場合、システムに定期的にクエリを実行して空き物理メモリの量を判断します。MicrosoftWindows 2000では、SQL Serverはバッファキャッシュを拡大または縮小して、空き物理メモリを4 MBに保ちますサーバーのアクティビティに応じて10 MB。この空きメモリを維持すると、Windows 2000がページングできなくなります。空きメモリが少ない場合、SQL ServerはメモリをWindows 2000に解放します。空きメモリが多い場合、SQL Serverはメモリをバッファプールに割り当てます。」
sh-beta

ああ-そうです-物理メモリの少しを解放するトリックを行います-あなたは正しいです!
ポールランダル

4

OSがRAMが不足していることを通知した場合、またはサービスを停止して再起動した場合にのみ解放されます。やるべきことは、 'max server memory'の値を設定して、SQLが使用する最大量を制限することです。RAMを必要とするサーバー上に他に何もない場合(そしてRAMが必要ない場合)、心配する必要はありません。


4

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

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


3

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


2

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

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

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


ヘクタールあ...はい確かにSQL 2000
BIBD

3
OSが叫んだ場合は返されませんが、OSが空き物理メモリの特定のしきい値を下回っていると判断した場合は返されます。参照してくださいmsdn.microsoft.com/en-us/library/ms178067.aspx
SH-βを

また、sh-betaの発言を補強するために、SQL Server 2000は、OSの物理メモリが不足していることに気づいたときにのみメモリを解放します。これは、WindowsがAPIを追加してOSがit "(msdn.microsoft.com/en-us/library/aa366799(v=vs.85).aspx)。SQL Server 2005は、Windowsのその新機能を利用しています。しかし、SQL Server 2000が作成されたとき、OSがそれを叫ぶ方法がなかったため、SQL Serverはメモリの圧力を定期的にチェックする必要がありました。
Ian Boyd、

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.