オプティマイザは、インデックス・カラム上で IN 述部を利用する特殊な最適化をサポートしています。この最適化は、同じインデックス・カラムに対して OR で結合された複数の述部にも等しく適用されます。これは、どちらもセマンティック上は等しいためです。最適化を有効にするには、定数だけ、またはクエリ・ブロック 1 回の実行中に定数である値 (外部参照など) だけを IN リストに指定してください。
オプティマイザは、修飾する IN リスト述部を検出した場合に、IN リスト述部にインデックス検索を十分に検討できる選択性がある場合には、IN リスト述部をネスト・ループ・ジョインに変換します。この最適化の機能を、次の例で説明します。
たとえば次のクエリがあるとします。これは、2 人の営業担当者が扱うすべての注文をリストします。
SELECT * FROM SalesOrders WHERE SalesRepresentative = 902 OR SalesRepresentative = 195; |
このクエリは、セマンティック上は次に示すものと同じです。
SELECT * FROM SalesOrders WHERE SalesRepresentative IN (195, 902); |
オプティマイザは、IN リスト述部の結合選択性がインデックス検索を保証できる程度に低いものと推定します。その結果、IN リストを仮想テーブルとして扱い、この仮想テーブルを SalesRepresentative 属性で SalesOrders テーブルにジョインします。この最適化の最終的な効果はアクセス・プランに追加のジョインを組み込むことですが、クエリのジョイン数は増加しないので、最適化時間には影響を与えません。
この最適化には、2 つの主要な利点があります。第 1 の利点は、IN リスト述部を検索引数可能として扱い、インデックス検索に利用できることです。第 2 の利点は、オプティマイザが IN リストをインデックスのソート順に合わせてソートし、検索効率を向上させることができることです。
上記のクエリのアクセス・プラン (省略形) は、次のとおりです。
SalesOrders<FK_SalesRepresentative_EmployeeID> |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |