SQL Anywhere は操作を効率化するために、セマンティック上は同等で、構文上は異なる形式にユーザのクエリを書き換えます。SQL Anywhere は、さまざまな書き換え操作を実行します。
アクセス・プランを読めば、それが元の文のリテラルな解釈と一致していないことがよくあります。たとえば、SQL 文の効率を高めるために、オプティマイザはジョインを使ってサブクエリを可能なかぎり書き換えようとします。
クエリ書き換えフェーズでは、より効率性と便宜性に優れたクエリの表現方法を検討するために、SQL Anywhere はさまざまな変形を実行します。クエリはセマンティック上等しいクエリに書き換えられる場合があるため、このプランは、元のクエリのリテラルな解釈とはかなり異なる場合があります。一般的な操作は次のとおりです。
不要な DISTINCT 条件の排除
サブクエリのネスト解除
UNION または GROUP 化されたビューや派生テーブルでの述部のプッシュダウンの実行
OR 述部と IN リスト述部の最適化
LIKE 述部の最適化
外部ジョインの内部ジョインへの変換
外部ジョインと内部ジョインの削除
述部の推定による利用可能な条件の発見
大文字と小文字の不要な変換の排除
サブクエリを EXISTS 述部として書き換え
カーソルが更新可能な場合、メイン・クエリ・ブロックではクエリ書き換え最適化を実行できないことがあります。カーソルを読み込み専用として宣言すると、最適化を利用できます。カーソル・タイプの選択とDECLARE CURSOR 文 [ESQL] [SP]を参照してください。
カーソルが更新可能なメイン・クエリ・ブロックで最適化を実行できない例については、不要な内部ジョインと外部ジョインの削除を参照してください。
クエリ書き換えフェーズで実行される書き換えの最適化のいくつかは、REWRITE 関数で返される結果で観察できます。REWRITE 関数 [その他]を参照してください。
SQL 言語の定義とは異なり、AND と OR の演算の厳密な動作を要求する言語もあります。言語によっては、左側の条件が最初に評価されることを指定しているものもあります。条件全体が真であると決定されると、コンパイラは右側の条件が評価されないよう指定します。
この調整により、これ以外の場合には 2 つのネストされた IF 文を必要とする条件を、1 つに組み合わせることができます。たとえば、C でポインタが NULL であるかどうかをテストしてから、これを次のように使用できます。最初の文でネストされた条件は、次の 2 番目の文で示される構文を使用して置き換えることができます。
if ( X != NULL ) { if ( X->var != 0 ) { ... statements ... } } |
if ( X != NULL && X->var != 0 ) { ... statements ... } |
C とは異なり、SQL には実行順序に関するこのような規則がありません。SQL Anywhere は、適合すると判断した場合、条件の順序を自由に再調整できます。SQL 言語の仕様では順序の違いが区別されないため、元の形式も順序が変わった形式もセマンティック上は等しくなります。特に、クエリ・オプティマイザは、WHERE 句、HAVING 句、ON 句の述部の順序を自由に変更できます。
不要な DISTINCT 条件の排除
サブクエリのネスト解除
UNION または GROUP 化されたビューや派生テーブルでの述部のプッシュダウン
OR 述部と IN リスト述部の最適化
LIKE 述部の最適化
外部ジョインから内部ジョインへの変換
不要な内部ジョインと外部ジョインの削除
述部の推定による利用可能な条件の発見
大文字と小文字の不要な変換の排除
サブクエリを EXISTS 述部として書き換える
ユーザ定義関数のインライン化
単純なシステム・プロシージャのインライン化
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |