DBサーバーとしてのみの機能だけ持たせているのなら、「SQL Server が使ったメモリを解放しない」事象は問題にならないのかもしれない。しかし、開発機であったり、社内運用しているものであったり、本番機でもアプリケーションサーバーと混在している、といったケースは多いだろう。
「SQL Server は使ったメモリを解放しないため、解放するにはSQL Serverの再起動が必要」というのが通説らしいが、稼働中に再起動はなかなか行えないことになる。

その解決策として、まずはメモリの使用量を制限しておくことが挙げられる。
SQL Server Management Studio を起動し、該当インスタンスを右クリックして[プロパティ]を選択する。


$VBA (マクロ) 作法/コーディング規約 集約中 ~ メタボなコードにサヨナラしよう


現れたダイアログの[ページの選択]から[メモリ]をクリックし、[最大サーバー メモリ(MB)]の値を調整のうえ、[OK]をクリックする。

$VBA (マクロ) 作法/コーディング規約 集約中 ~ メタボなコードにサヨナラしよう


デフォルト値ではこの[最大サーバー メモリ(MB)]の値はSQL Server が認識できる最大値が入っているらしい。この動作はSQL Server 稼働中にでも実行できる。
SQL Server がメモリを大量に消費している場合、[最大サーバー メモリ(MB)]の値に、例えば256と入力し[OK]をクリックすれば、タスクマネージャーでメモリの使用量で「メモリの使用量がガクンと落ちる」というのが見て頂けるだろう。
そのあと2048とか4096とかに変更してもその場でメモリを確保するわけではないので晴れてメモリの解放ができる、ということになる。


しかし、運用をしていくという意味ではこの画面をわざわざ起動して人力で実施、はあまり現実的ではないだろう。SQL Server 2008R2 で調べてみたところ、[最大サーバー メモリ(MB)]の値はストアードプロシージャで変更できる。
調べるといっても、トレースを取っただけであるが・・。

ストアードプロシージャは次の通り。


---- 1. メモリを小さく取る
EXEC sys.sp_configure 'show advanced options', '1' RECONFIGURE WITH OVERRIDE
go
EXEC sys.sp_configure 'max server memory (MB)', '512'
go
RECONFIGURE WITH OVERRIDE
go
EXEC sys.sp_configure 'show advanced options', '0' RECONFIGURE WITH OVERRIDE


---- 2. メモリを元のサイズに戻す
EXEC sys.sp_configure 'show advanced options', '1' RECONFIGURE WITH OVERRIDE
go
EXEC sys.sp_configure 'max server memory (MB)', '[元の値]'
go
RECONFIGURE WITH OVERRIDE
go
EXEC sys.sp_configure 'show advanced options', '0' RECONFIGURE WITH OVERRIDE


上記の 512 の値が[最大サーバー メモリ(MB)]の指定値なので、いったん小さい値にしたものを実行し、そのあと元の値にして実行、とすればメモリの解放が行える。

注意点としては
・言うまでもないが、[元の値] は環境に応じて値を設定すること。例えば 4096 等。
・上記を連続で実行した場合、思った通りに解放されない場合があった。1.を実行し、少し(2~3秒程度)間を開けてから 2.を実行する方が確実である。
・上記、いったん小さくする値を、確か 256 にしたところと SQL Server の動作がおかしくなったことがあった。他の環境ではうまくいったりもするので環境によるようだ。512くらいが無難かも。

自動実行するなり、というテクニックは応用なので試されて欲しい。