SQLServerはデフォルトで物理メモリのある限り、データベースバッファキャッシュとしてメモリを使用する。
なので、タスクマネージャでメモリを目一杯使用していてもメモリリークしているとは限らない。
サーバ上で動作しているのがSQLServerのみであれば上記のデフォルト設定のままでも問題はないが、
APサーバと兼用している場合などはSQLServerで使用するメモリの上限を設定しておくほうがよい。
なお、テーブル毎に使用しているデータベースバッファキャッシュを調べるSQLは以下の通り。
SELECT DB_NAME(b.database_id) as データベース, OBJECT_NAME(p.object_id) as テーブル, p.index_id ,COUNT(*) As 使用ページ数 ,(COUNT(*) * 8) as 使用サイズ_KB FROM sys.allocation_units a INNER JOIN sys.partitions p ON a.container_id = p.hobt_id INNER JOIN sys.dm_os_buffer_descriptors b ON a.allocation_unit_id = b.allocation_unit_id WHERE b.database_id = DB_ID() --現在接続中のDB のみ GROUP BY b.database_id, p.object_id, p.index_id ORDER BY 使用ページ数 DESC
※SQLServerのページサイズは1ページあたり8KB
以下のSQLでデータベースバッファキャッシュを開放できる。
ただし、SQLServer内で開放するだけなのでSQLServer全体が使用しているメモリが開放されるわけではない。
DBCC DROPCLEANBUFFERS
動作確認環境:SQL Server 2008