ほとんどすべてのクエリで効率的なアクセス方式は、WHERE 句、ON 句、HAVING 句に検索引数可能な条件が存在するかどうかによります。インデックス検索は、マッチング述部に検索引数可能な条件を利用することによってのみ可能になります。また、ハッシュ、マージ、ブロックの各ネスト・ループ・ジョインを使用できるのは、等価ジョイン条件がある場合だけです。このような理由から、SQL Anywhere は、オプティマイザが利用できる簡略または暗黙的な条件を発見するために、オリジナルのクエリ・テキスト内で探索条件を詳細に分析します。
前処理として、ビューが拡張され、マージされてから、オリジナルの文の述部に対していくつかの簡略化が行われます。次に例を示します。
X = X
は、X が NULL 入力可の場合は X IS NOT NULL
に書き換えられ、それ以外の場合は述部は削除される
ISNULL(X,X)
は X
に書き換えられる
X+0
は、X が数値カラムの場合は X
に書き換えられる
AND 1=1
は削除される
OR 1=0
は削除される
単一要素で構成される IN リスト述部は、単純な等号条件に変換される
この前処理の後に、SQL Anywhere はオリジナルの探索条件を論理積正規形 (CNF: conjunctive normal form) に正規化しようとします。式を CNF に正規化するために、式の各項が AND で結合されます。各項は、単一のアトミックな条件、または OR で結合された一連の条件で構成されます。
任意の条件を CNF に変換すると、複雑さは同じでも、かなり多数の条件セットを持つ式になります。SQL Anywhere はこの状況を認識し、条件を単純に CNF に変換するのを控えます。代わりに、オリジナルの探索条件によって暗黙的に指定された利用可能な述部のオリジナルの式を分析し、推定されたこれらの条件をクエリに AND します。完全正規化も、高コストの述部 (限定サブクエリ述部など) の重複を必要とする場合は退けられます。ただし、このアルゴリズムでは、可能な場合はいつでも IN リスト述部がマージされます。
探索条件が完全に正規化されるか、利用可能な条件が検出されると、オプティマイザは中間的分析を実行し、中間的等号条件、主として中間的ジョイン条件と定数を伴う条件を発見します。これによって、このような中間的条件では追加の代替ジョイン順が許可される場合があるため、オプティマイザはコストベースの最適化フェーズ時にジョイン列挙を実行する自由度を高めます。
元のクエリを次に示します。
SELECT e.Surname, s.ID, s.OrderDate FROM SalesOrders s, Employees e WHERE ( e.EmployeeID = s.SalesRepresentative AND ( s.SalesRepresentative = 142 OR s.SalesRepresentative = 1596 ) ) OR ( e.EmployeeID = s.SalesRepresentative AND s.CustomerID = 667 ); |
このクエリには結合等価ジョイン条件がありません。そのため、オプティマイザは述部の詳細分析を実行しなければ、効率的なアクセス・プランを発見できません。幸い、SQL Anywhere は式全体を CNF に変換して同じクエリを生成できます。
SELECT e.Surname, s.ID, s.OrderDate FROM SalesOrders s, Employees e WHERE e.EmployeeID = s.SalesRepresentative AND ( s.SalesRepresentative = 142 OR s.SalesRepresentative = 1596 OR s.CustomerID = 667 ); |
このクエリは、内部ジョイン・クエリとして効率的に最適化できます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |