PFS / GAM / DCM / は何ページごとに存在する?? に続いて疑問に思ったので調べてみましたシリーズです。
SQL Server 2008 以降ではリソースガバナーという機能が追加されています。
リソースガバナーを使用することで、CPU やメモリの利用状況を制御することができるのですが、メモリはどの領域の制御なのかが気になったので調べてみました。
■ SQL Server のメモリのおさらい
まずは、SQL Server のメモリのおさらいから。
SQL Server のメモリ領域ですが以下のような領域があります。
リソースガバナーのメモリの制御では上記のどの領域が対象となるかを調べるのが今回のお話です。
■メモリの使用状況を見てみる
それでは大き目のテーブル (5GB) をソートするクエリを実行して、メモリの使用量を確認してみたいと思います。
以下の画像がテーブルをソートしてデータを取得しているときの SQL Server のメモリの状態をパフォーマンスモニタで取得したものになります。
リソースガバナーを有効にしていない場合、リソースガバナーを設定しても対象となるワークロードグループが設定されていない場合は [default] ワークロードグループが使用されます。
今回はリソースガバナーを有効にしていないため、実行したクエリは [default] のワークグループに所属することになります。
[Granted Workspace Memory] と [default] の [Active memory grant amount] の値が一致していることが確認できると思います。
リソースガバナーで制御ができるメモリの領域はソート / グルーピング / ジョイン 等で使用される [Workspace Memory] が対象となります。
デフォルトでは [default] ワークロードグループの [メモリ許可の割合] は [25%] が設定されています。
リソースガバナーが有効になっていない場合もこの 25% は適用されますのでソートで使用できるメモリにも上限が決まっています。
# リソースガバナーを有効にして、25% を変更にしても無効にした場合には 25% となります。
# 25% の母数となる数字が私も正確にわかっていないのですが、[Target Server Memory] 辺りが母数になっているのではと思っています。
それではリソースガバナーを有効にして、[メモリ許可の割合] を [25] → [100] に変更してみたいと思います。
[Granted Workspace Memory] と [default] の [Active Memory grant amount] が増加しているのが確認できます。
# ワークスペース用のメモリが増加したことにより、[Database pages] (データキャッシュ用のメモリ) が減っていますが。
ワークスペースメモリを消費するような処理を実行する場合は、リソースガバナーで [メモリ許可の割合] の上限を増やしたワークロードグループを用意しておくと、処理の最適化ができるかもしれないですね。