Understanding the Procedure Cache on SQL Azure – SQL Azure Team Blog – Site Home – MSDN Blogsを簡単に翻訳したエントリーです。
SQL ServerとSQL Azureはクエリのパフォーマンス改善に利用する為のプロシージャキャッシュを持っています。このエントリでは、SQL Azure上のプロシージャキャッシュの動きについて説明します。
SQL Azureには、実行計画とバッファデータの保存に使用するためのメモリプールがあります。このメモリプールは、データベースの所有者に関係無く、物理マシン上の全てのデータベースで使用されます。プールは、マシン上の全てのデータベースにまたがる為、自分のDBの実行計画が一つも保存されていない場合があります。実行計画やバッファデータがプール上で使用できる割合は、システムの状態に応じて動的に変わります。メモリプールの中で、実行計画の保存に使用されている部分は、プロシージャキャッシュと呼ばれます。
SQL AzureでSQL文を実行したとき、リレーショナルエンジンは最初に、同じSQL文に実行計画が存在するかどうかを確認します。SQL Azureは実行計画がある場合は再利用し、SQL文を再コンパイルするオーバーヘッドを減らします。もし実行計画が存在しない場合は、SQL azureはクエリの実行計画を生成します。
SQL Azureとプロシージャキャッシュのレプリカ
SQL Azure上で動作するデータベースのインスタンスはレプリカと呼ばれます。同時に、起動している1つのデータベースには、3つのレプリカが存在します。一つ目のレプリカは、プライマリレプリカと見なされます。全ての読み書きをするクエリはプライマリレプリカに発行されます。他の二つのレプリカはセカンダリと見なされます。プライマリレプリカに書き込まれたデータは、セカンダリレプリカに書き込まれます。もしプライマリレプリカが落ちた場合、ロードバランサーが起動し、セカンダリレプリカをプライマリレプリカへ昇格させます、
それぞれのレプリカは、別々のラックに分かれた異なる物理マシン上に配置されます。プロシージャキャッシュは、各サーバごとにあるので、プライマリレプリカが落ちてセカンダリレプリカがプライマリレプリカに昇格したときには、プロシージャキャッシュには、そのデータベース用の実行計画はありません。
プロシージャキャッシュの統計情報
SQL Azureはキャッシュ上に全ての実行計画のパフォーマンス統計情報を保持しています。動的管理ビュー(DMV)であるsys.dm_exec_query_statsを使用して自分のデータベースに発行された統計情報を見ることができます。
SELECT * FROM sys.dm_exec_query_stats
sys.dm_exec_query_statsを使用してI/Oパフォーマンスが悪いクエリを見つける方法について、別のエントリで説明しています。
sys.dm_exec_query_statsは、SQL Azureデータベースのプライマリレプリカの統計情報のみを表示します。もしセカンダリレプリカがプライマリレプリカに昇格したら、sys.dm_exec_query_statsの結果は、すごく変わります。キャッシュ上にクエリは無く、実行回数は少なくなります。
プロシージャキャッシュから実行計画を削除する
実行計画は、メモリに保存できる限りは、プロシージャキャッシュに記録されます。Memory Pressureが発生した場合、SQL Azureは、プロシージャキャッシュから削除する実行計画を決定するためにコストベースを使用します。
SQL Azureは計画の所有者に関係無くキャッシュから実行計画を削除します。サーバ上に存在する全てのデータベースの、全ての実行計画が横断的に、削除のために評価されます。プロシージャキャッシュ上の実行計画は、個々のデータベースでは無く、物理マシーンの利益の為に最適化されます。
SQL Azureは現在のところDBCC FREEPROCCACHE (Transact-SQL)をサポートしていません。その為、手動でキャッシュから実行計画を削除することはできません。しかし、クエリ(ALTER TABLE や ALTER VIEW) でテーブルやビューの参照関係を変更すると、キャッシュから実行計画は削除されます。
まとめ
SQL AzureはSQL Serverの上に構築されているので、多くの点で、プロシージャキャッシュはSQL Serverと同じように動作します。しかし、幾つかの違いがあり、それらを理解しておいて方が良いと思います