MSSQL はメモリを大量に消費し、メモリが増加し続ける、またはメモリを使用するように設定されているのに、何が起こっているのかという質問をよく見かけます。
まず、MSSQL がメモリをどのように使用するかを見てみましょう。
通常、最大のオーバーヘッドはデータのキャッシュに使用され、メモリが十分であれば、使用されたデータと使用すると思われるデータがすべてメモリに放り込まれます。メモリが空になるまで、ヒット率の低いデータは得られません。では不十分です。したがって、一般に統計 io を見ると、表示される物理読み取り値はすべて 0 になります。
2 番目は、クエリのコストです。一般に、ハッシュ結合は比較的大きなメモリ オーバーヘッドをもたらしますが、マージ ジョインとネストされたループのオーバーヘッドは比較的小さく、また、ソート、中間テーブル、およびカーソルのオーバーヘッドも比較的大きくなります。
したがって、関連付けと並べ替えに使用される列には通常、インデックスが必要です。
次のステップは、比較的小さい実行プランとシステム データのストレージです。
まず、システム内にメモリを競合する他のアプリケーションがない場合、一部のデータを強制的にキャッシュに固定することもできます。ただし、他のアプリケーションがある場合、MSSQL は必要に応じてメモリを解放しますが、スレッドの切り替えや IO 待機にも時間がかかるため、パフォーマンスが低下します。このようにして、MSSQL の最大メモリ使用量を設定する必要があります。最大メモリ使用量を構成する場所は、SQL Server のプロパティ ([メモリ] タブ) で確認できます。また、sp_configure を使用して行うこともできます。他にアプリケーションがない場合は、MSSQL のメモリ使用量を制限しないでください。
次に、クエリのオーバーヘッドを見てみましょう。オーバーヘッドが低いほど良いのは、逆に、より多くのメモリを使用するとクエリ速度が低下することを意味するためです。したがって、通常は中間テーブルとカーソルの使用を避け、頻繁に関連付けられたり並べ替えられたりする列にインデックスを作成する必要があります。