SQLServerがクエリを処理する時の挙動について

色々調べたのでメモ。

【そもそも的な部分】
SQLServerはクエリ投げられると自分でクエリの実行方法を選択して実行してくれるらしい。
この実行方法を実行プラン、選択してくれる機能をクエリオプティマイザという。
ここら辺の詳細以下。
RDBの心臓部
以下2つに大別される。
●ストレージエンジン
・ディスク間のデータ読み書き
・レコード管理
・同時実行の制御
・ログファイルの保守

●クエリプロセッサ
SQL構文解釈
SQL構文実行方法の決定
・選択プランの実行
・ユーザー、プログラム、ストレージエンジンそれぞれとの対話
・ユーザーからの要求に対する結果取得方法の決定。

【クエリオプティマイザについて】
一般的に主要なクエリオプティマイザは以下2つに大別される。
●構文ベースのクエリオプティマイザ
クエリの厳密な構文及びクエリ内の句の順序によって手続き的なプランを作成する。
クエリが同じなら毎回同じプランを選択するので、例えば以下のような事はやらない。
・レコード数や構成によるプランの変動(クエリが同じなら毎回同じプランをたてる)
・DBの統計調査や保守
●コストベースのクエリオプティマイザ
DBの統計情報やレコード数、構成を元に複数たてた実行プランの各コストを予測。
その中から最適なプランを選択する。
SQLServer6.5、7で実装されている。
例えば以下のようなことはやらない。
・クエリの厳密な構文や句の順序によるプランの選択。
(クエリが同じでもDBの状況によりプランが変動する)
※SQLServer2008にて、スキーマの変更は統計の保守時に参照しない様子。

以下から本題。
SQLServerはクエリ処理時は以下二つのフェーズに大別される。
1.クエリ最適化
クエリオプティマイザが最速の実行プランを選択するフェーズ。
主に以下を選択。
・使用するインデックス(あれば)
・結合の実行順序
・制約(where句等)の適用順序
・最高のパフォーマンスを達成できる可能性の高いアルゴリズム(統計から得られるコスト情報に基づいて選択)

2.クエリ実行
クエリ最適化で選択したプランの実行。

※クエリプロセッサとクエリオプティマイザの違いについて
クエリオプティマイザはSQLステートメントを実行するのに最適な方法の選択を提供するコンポーネント(機能)。
クエリプロセッサはクエリオプティマイザを使用してクエリ最適化を行い、実行する。