HOME >> Tips >> Microsoft SQL Server

SQL Server を再起動しないで使用中のメモリを解放する方法

2015/7/8
文書番号:20331

SQL Server で使用できるメモリの最大値を設定していなかった場合や、データベース以外のサービスが稼動するサーバーなどで想定以上にメモリが消費されていた場合など、メモリを解放させたいことがあります。

SQL Server は SQL Server サービスを再起動しないと使用しているメモリは解放されません。
しかし、稼動しているサービスを再起動するのは運用上なかなか容易ではなく、何とか再起動しないでメモリを解放できないかと思うことがあります。

そこでSQL Server が使用中のメモリを再起動せずに解放させる方法です。

SQL Server の使用メモリの上限を設定する」 の最後に記載したように既に使用じているメモリの量よりも小さい値を最大値として設定すると その値までメモリを解放してくれます。
これを利用して SQL Server を再起動させずにメモリを解放します。

【設定方法】

  1. タスクマネージャーを起動し、SQL Server が現在使用中のメモリを確認します。
    検証環境なので大して使用していませんが現在 475.4MB 使用中です。

    クリックで拡大

  2. SQL Server Management Studio を起動し、管理者アカウントでログインします。
    オブジェクトエクスプローラーからサーバー名の部分を右クリックして「プロパティ」をクリックします。

    クリックで拡大

  3. 「ページの選択」欄で「メモリ」を選択します。
    「サーバーメモリオプション」の「最大サーバーメモリ」に200MB(メモリ解放後の使用量)を指定して「OK」をクリックします。

    クリックで拡大

  4. タスクマネージャーを確認すると 196.9MB になりました。

    クリックで拡大

  5. 再度サーバーのプロパティを開き、メモリの最大値を元の値に戻しておきます。

    クリックで拡大

【コマンドで実行する方法】

上記の操作を定期的に行いたい場合、コマンドで実行することができます。
メモリの最大値を小さくする

--メモリの最大値を小さくする
EXEC sys.sp_configure N'show advanced options', N'1'  RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'2048'  --小さくするメモリの値を指定
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'show advanced options', N'0'  RECONFIGURE WITH OVERRIDE
GO


--メモリの最大値を元に戻す
EXEC sys.sp_configure N'show advanced options', N'1'  RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'max server memory (MB)', N'20480'  --元に戻すメモリの値を指定
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sys.sp_configure N'show advanced options', N'0'  RECONFIGURE WITH OVERRIDE
GO
現在のメモリ使用量に大して非常に小さい値を設定するとメモリの解放に時間がかかります。
その間 SQL Serevr がビジー状態になることもありますので少しずつ小さくしたほうがよさそうです。

このときのメモリの解放は 「SQL Server が使用するために確保したけれども今現在は使用していない領域」を解放しているものと思われます。
今現在使用しているメモリ量よりも小さい値を設定しても解放できないのでこの点からも少しずつ小さくしたほうがよさそうです。


また、あまりにも小さい値(その SQL Server で必要最低限のメモリ量より小さい値)に設定すると SQL Server の動作が不安定になり、 結局サービスを再起動しなくてはいけなくなってしまいます。

上記の検証環境で調子にのって 100MB にしたのですがメモリ使用量は減らず、設定を戻そうとサーバーのプロパティを開こうとしてもエラーで開かなくなり・・・結局再起動しました。

本番稼働中の SQL Server では 512MB 程度より小さい値にはしないほうがいいかもしれません。
(環境によりますので適宜判断してください。)