
64GB のメモリを搭載した Windows Server 2019 Standard (x64) を使用しています。
下のスクリーンショットは、メモリ使用量が96%であることを示しています。SQL Server Windows NT実行中、344.5 MB 使用中。
これはサービスを停止した後のタスクマネージャーですSQL Server Windows NTメモリ使用量は8%まで下がりました。
サービスを開始しますSQL Server Windows NT再度。タスク マネージャーは 9% と非常に低いですが、SQL Server はメモリ使用量が 96% だったときよりも多くのメモリを使用しています。
2つの質問:
- メモリの問題は何ですか?
- SQL Server インスタンスを再起動せずにメモリ使用量を減らすにはどうすればよいですか?
答え1
ここで重要な詳細が抜けています。タスク マネージャーでは、SQL Server は 344.5 MB の RAM しか使用していないと表示されますが、実際にはそれよりはるかに多くの RAM、ほぼすべてを独自使用のために予約しています。タスク マネージャーではこれは表示されません。タスク マネージャーの数字は、実際にはシステム メモリの 97% にはなりません。予約済みメモリはそこに表示されないためです。
メモリのほとんどが他の何かによって使用されているため、SQL Server は 344.5 MB 以上を使用できないという想定は、まったくの間違いです。実際にはそうではありません。タスク マネージャーは誤解を招く可能性があります。実際のパフォーマンス カウンターを確認してください。
よりわかりやすく説明するために更新します。
SQLサーバー意図的にメモリにデータをキャッシュし、時間が経つとシステムで使用可能なメモリのほとんどすべてを使用します。しかし、このメモリはタスク マネージャーには表示されません (少なくともすべては表示されません)。これは、SQL Server が OS に「これだけのメモリが必要ですが、これはキャッシュ用です。なくても問題ありません。必要な場合は自由に再利用してください」と伝えるためです。つまり、タスク マネージャーには、SQL Server が実際に予約したメモリよりも、はるかに少ないメモリ使用量が表示されます。
これは決して問題です。これは意図的に設計されています。あなたが見ている「問題」は存在せず、タスク マネージャーに表示される内容だけが誤解を招きます。
SQL Server を停止すると、当然のことながら、割り当てられたメモリがすべて解放されます。タスク マネージャーに表示されるメモリと、表示されないメモリ (はるかに大きい) の両方です。再起動すると、メモリの使用量はごくわずかになります。SQL Server がメモリにデータをロードしてキャッシュするため、時間の経過とともにメモリ使用量は再び増加します。しかし、このメモリのほとんどは、ない特定のツールでは認識できないため、タスク マネージャーには表示されません。
また、SQL Serverが実際に必要メモリを別の方法で割り当て、それからタスクマネージャーにはそれが表示されます。SQL Serverが実際に60GBのメモリを使用していることがわかります。必須キャッシュにのみメモリを使用するのではなく、その量のメモリを節約します。
答え2
このマシンでは SQL Server を実行しているため、SQL Server が行うことが実行されます。つまり、OS で使用可能なメモリの (ほぼ) すべてが予約されるため、大きなクエリやその他の操作を実行するときに RAM を割り当てる必要がなくなり、既に RAM が確保されます。
いくつかの選択肢があります。
- 受け入れてください。このマシンで SQL Server のみを実行している場合は、意図したとおりに動作しています。そのままにしておきます。
- 上限を設定します。このサーバーで他のワークロードを実行する必要がある場合は、SQL が予約する RAM の量を制限できます。
SQL が消費する RAM をまったく使用していない場合を除いて、オプション 2 は絶対に実行しないでください。これは、OS レベルの SQL パフォーマンス カウンターと SQL レベルの動的管理ビューを測定している場合にのみわかります。
全体像として、実際に解決しようとしている問題は何ですか? このシナリオでは、「メモリを解放する」ことは、他の用途に使用できるようにメモリを解放していることがわかっていない限り、無意味な作業です。SQL パフォーマンスの問題が発生していますか? もしそうなら、ボトルネックの原因が、たとえばインデックス設計の誤りやクエリの最適化されていないことではなく、RAM であるとどのように判断しましたか?
私があなたに伝えたいのは適切な監視を使用してパフォーマンスの問題を診断します。これを実行するには、SQL について多くの知識と、Windows についてある程度の知識が必要です。DBA でない場合は、DBA を雇うか契約で雇うか、購入した製品の SQL の場合はソフトウェア ベンダーと協力します。会社が DBA なしで独自に作成したものである場合は、DBA を雇ってください。
デフォルトでは、SQL Server インスタンスは時間の経過とともに、サーバーで使用可能な Windows オペレーティング システム メモリのほとんどを消費する可能性があります。メモリが取得されると、メモリ不足が検出されない限り、メモリは解放されません。これは設計によるもので、SQL Server プロセスでメモリ リークが発生していることを示すものではありません。
/編集内容に基づいて編集:
私はシステム管理者ではありませんが、他のすべてが Windows によって消費されているため、SQL Server がメモリをほとんど消費していないように思われます。
ここではほぼ間違いなく間違いです。上で述べたように、SQL サーバーは時間の経過とともにシステム RAM のほぼすべてを割り当てます。sqlserver.exe プロセスによって使用されている RAM の量は、SQL が実際に割り当てた RAM の量を示すものではありません。DMV とパフォーマンス カウンターがそれを示します。
私は SSMS を使用してデータベースを操作していますが、すべてがいかに遅いかを直接実感しています。テーブル ペインを開いてすべてのテーブルを表示するといった単純な操作でも時間がかかり、タイムアウトになることもあります。
これを SQL サーバー上で実行するのではなく、ワークステーションから実行してください。