この項では、文の注釈フェーズから実行完了までの各フェーズについて説明します。また、オプティマイザの設計の基本となる仮定条件について説明し、次に選択性推定、コスト推定、クエリ処理のステップについて説明します。
SQL Anywhere クエリ処理の詳細については、ホワイトペーパー『Query Processing Based on SQL Anywhere 12.0.1 Architecture』 ( http://www.sybase.com/detail?id=1096047) を参照してください。
結果セットのない文 (UPDATE 文や DELETE 文など) も、クエリ処理のフェーズを経由します。
注釈フェーズ データベースサーバは、クエリを受け取ると、パーサを使用して文を解析し、クエリの代数表現 (解析ツリー) に変換します。このフェーズでは、「解析ツリー」はセマンティックと構文のチェック (クエリで参照されるオブジェクトがカタログ内に存在することの検証など)、権限のチェック、定義済み参照整合性制約を使用した KEY JOIN と NATURAL JOIN 変換、非マテリアライズドビュー展開などに使用されます。このフェーズの出力は、解析ツリーの形式で書き換えられたクエリで、元のクエリで参照されるすべてのオブジェクトに対する注釈が含まれます。
セマンティック変形フェーズ このフェーズでは、クエリに対して反復的なセマンティック変形を実行します。クエリが注釈付きの解析ツリーとして表されることに変わりはありませんが、リライト最適化 (ジョインの削除、DISTINCT の削除、述部の正規化など) がこのフェーズで適用されます。このフェーズのセマンティック変形は、解析ツリー表現にヒューリスティックに適用されるセマンティック変形規則に従って実行されます。
データベースサーバによってプランがキャッシュ済みのクエリは、このクエリ処理のフェーズをスキップします。また、単純な文もこのフェーズをスキップする場合があります。たとえば、オプティマイザのバイパスでヒューリスティックプラン選択を使用する文の多くは、セマンティック変形フェーズで処理されません。このフェーズが文に適用されるかどうかは SQL 文の複雑さによって決まります。
最適化フェーズ 最適化フェーズでは、クエリの別の内部表現であるクエリ最適化構造体を使用します。クエリ最適化構造体は、解析ツリーから構築されます。
データベースサーバによってプランがキャッシュ済みのクエリでは、このクエリ処理フェーズはスキップされます。また、単純な文もこのフェーズをスキップする場合があります。
このフェーズは、次の 2 つのサブフェーズに分かれています。
最適化前フェーズ 最適化前フェーズは、後から列挙フェーズで必要になる情報を最適化構造体に設定します。このフェーズでは、クエリを分析し、クエリアクセスプランで使用できる関連するインデックスとマテリアライズドビューをすべて検出します。たとえばこのフェーズでは、ビューマッチングアルゴリズムにより、クエリのすべてまたは一部を満たすために使用可能なすべてのマテリアライズドビューが特定されます。また、オプティマイザは、クエリの述部分析を基にして、クエリのテーブルをジョインするために列挙フェーズで使用可能な代替のジョイン方式を構築します。このフェーズでは、最適なクエリアクセスプランに関する決定は行われません。このフェーズの目的は、列挙フェーズの準備です。
列挙フェーズ このフェーズでオプティマイザは、最適化前フェーズで生成した構成要素を使用して、クエリの可能なアクセスプランを列挙します。検索領域は非常に大きいため、オプティマイザは生成に独自の列挙アルゴリズムを使用し、生成されたアクセスプランを削除します。プランごとにコスト推定が計算されます。コスト推定は、それまでの最適なプランと現在のプランとを比較するために使用されます。この比較時に、コストの高いプランは廃棄されます。コスト推定では、リソースの使用 (ディスクや CPU の操作など)、中間結果のロー数の予測値、最適化ゴール、キャッシュサイズなどが考慮されます。列挙プランの出力は、クエリの最適なアクセスプランです。
プラン構築フェーズ プラン構築フェーズでは、最適なアクセスプランを利用して、クエリの実行に使用するクエリ実行プランの対応する最終表現を構築します。Interactive SQL のプランビューアで、プランのグラフィカルバージョンを表示できます。グラフィカルなプランにはツリー構造があり、各ノードは特定の関係代数演算を実装する物理演算子です。たとえば [ハッシュジョイン] や [順序付けされた Group By] は、それぞれジョイン操作や GROUP BY 操作を実装する物理演算子です。
データベースサーバによってプランがキャッシュ済みのクエリでは、このクエリ処理フェーズはスキップされます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |