AWE を使用すると AWE によってマッピングされたユーザーモード (2GB) を超える領域はデータキャッシュでしか使用されないということを聞くことがあるかと思います。
今回はデータキャッシュとプラン (クエリ) キャッシュについてまとめていきたいと思います。
AWE を使用すると以下のようにメモリを使用することが可能となります。
SQL Server のパフォーマンスモニタでは以下のメモリの情報を取得することが可能です。
以下は Denali で取得できる情報になります。
# SQL Server のバージョンによっては項目が違うのですが、似たような情報は他の項目から取得することができます。
- Connection Memory
- Database Cache Memory (Database pages)
- Free Memory
- Granted Workspace Memory
- Lock Memory
- Optimizer Memory
- SQL Cache Memory (Cache Pages)
これと上の図をマッチングしてみます。
ユーザーモードの領域を超えて割り当てが可能なのは [Database Cache Memory] となります。
それではこのあたりの動きを確認していきたいと思います。
まずはデータベースキャッシュメモリを確認してみます。
今回は SQL Server 2008 R2 の環境を使用しています。
# Denali を使用していないのには理由があるのですが、これは別の機会にまとめる予定です。
Contents
■AWE を設定していない状態のデータベースキャッシュメモリの使用状況
まずは AWE を設定していない状態でのデータベースキャッシュメモリの使用状況を確認してみます。
データベースキャッシュメモリはデータをキャッシュするために使用されます。
今回は 17 GB 近いデータが格納されているテーブルを用意しました。
このテーブルに対して SELECT を実行して、データベースキャッシュの状態を確認していきたいと思います。
SELECT は SSMS で実行しているのですが、SSMS のプロセスで余計なメモリを消費されないように実行結果はファイルとして出力しています。
# グリッドやテキストで SSMS 上に結果を表示すると SSMS でメモリを消費してしまいますので。
以下のグラフはサーバーの空きメモリとデータベースキャッシュの状態をグラフにしたものです。
AWE を有効にしていないため、メモリを最大限使用できていないことが確認できます。
それでは、AWE を有効にして同様のデータを取得してみます。
■AWE を設定しいる状態のデータベースキャッシュメモリの使用状況
AWE を設定している状態では以下のようなメモリ使用状態となります。
先ほどと比較して、データベースキャッシュに使用できるサイズが増加していることが確認できます。
AWE が有効に働いていますね。
それでは、同様の情報をプランキャッシュでも取得してみたいと思います。
■AWE を設定していない状態のプランキャッシュメモリの使用状況
今回は大量のアドホッククエリを動的に生成して EXEC するクエリを実行して、プランキャッシュにアドホッククエリを大量にキャッシュするようにしてテストをしています。
AWE は設定していないので、プランキャッシュとしては 900 MB 程度が上限となっています。
それでは、AWE を設定して情報を取得してみます。
■AWE を設定している状態のプランキャッシュメモリの使用状況
プランキャッシュに関しては AWE の恩恵が受けられない領域となります。
そのため AWE の設定有無によるメモリ使用量の変更はありません。
AWE を設定してもプランキャッシュは通常のユーザーモードのメモリ空間の中でしか確保ができませんので、AWEの有効有無による差が発生しません。
最後に AWE を有効にした状態で、データベースキャッシュとプランキャッシュを最大限使われるようにした際の情報を取得してみたいと思います。
データベースキャッシュが増加した後にプランキャッシュを増やすようにしています。
# サーバーのスペック的に両方を同時に増加させようとすると結構時間がかかりそうだったもので。
途中からプランキャッシュが増えるようにしていますので、プランキャッシュの増加に合わせてデータベースキャッシュのメモリが減っていります。
AWE を有効にしてもプランキャッシュの上限は変わりません。
プランキャッシュの上限を増やすためには、/3GB スイッチを利用します。
次の投稿では、AWE と /3GB スイッチの併用についてまとめていきたいと思います。