OR を使用してリンクされた検索条件が含まれるSQL 文の場合、SQL オプティマイザは、最初に各検索条件を個別に分析します。
b1 AND b2 AND (b3 OR (b4 AND b5))
式 b1、b2 および (b3 OR (b4 AND b5)) は最初に個別に分析されます。オプティマイザがキー列 b1 または b2 の等価条件を検出した場合、検索範囲は事実上これ以上制限できないため、検索方針を選択するときに (b3 OR (b4 AND b5)) を考慮する必要はありません。
キー列の等価条件が検出されない場合、OR を使用してリンクされた他の検索条件 (まだ考慮されていない条件) が分析されます。SQL オプティマイザは以下の処理を実行します。
..
1. 論理和標準形に変換します。
b1 AND b2 AND (b3 OR (b4 AND b5))
を論理和標準形に変換します。
(b1 AND b2 AND b3) OR (b1 AND b2 AND b4 AND b5)
2.
新しい式を分析します。
括弧で囲まれた新しい式は個別に分析します。
3.
コストを決定します。
論理和標準形の括弧で囲まれた式についてさまざまな検索方針のコストが合計されます。検索方針として最初に決定されたコストよりもこの合計の方が小さい場合、OR
を使用してリンクされた検索条件は考慮せずに、これらのさまざまな検索方針が使用されます。
(b1 AND b2 AND b3) と (b1 AND b2 AND b4 AND b5) の合計コストの方が b1 と b2 の検索方針のコストより小さい場合、(b1 AND b2 AND b3) と (b1 AND b2 AND b4 AND b5) の方針が使用されます。
4. 最も費用対効果の高い検索方針を使用して SQL 文を実行します。
例
SQL オプティマイザを説明するために使用する例は、スキーマ HOTEL におけるデモデータベースDEMODB とその完全なデモデータにもとづいています。
データベースシステムのコンセプト、スキーマ HOTEL のオブジェクト
SELECT * FROM hotel.customer
WHERE name = 'Smith' AND firstname = 'Sally'
OR name = 'Miller' AND firstname =
'Sally'
修飾:
name =
'Smith' AND firstname = 'Sally'
OR name = 'Miller' AND firstname =
'Sally'
テーブル CUSTOMER
の一次キー:
cno
修飾列の索引:
FULL_NAME_INDEX
(name, firstname)
使用される検索方針、第 1 述語: EQUAL CONDITION FOR
INDEX
使用される検索方針、第 2 述語: EQUAL
CONDITION FOR INDEX
複数の AND 条件が 1 つの OR 条件にリンクされています。AND 条件は OR 条件よりも優先されます。AND 条件ごとに最善のアクセス方針が決定されます。これらの AND 条件は両方とも、等価条件を使用して 2 つの索引列を修飾しています。このため、これらはそれぞれ EQUAL CONDITION FOR INDEX を使用して処理することができます。ADDL QUALIFICATION ON INDEX が出力されます。これは、索引で OR を使用してリンクされた列もチェックされるためです。
EXPLAIN 文の結果
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CUSTOMER |
|
34 |
|
|
FULL_NAME_INDEX |
EQUAL CONDITION FOR INDEX |
|
|
|
ADDNL. QUALIFICATION ON INDEX |
|
|
NAME |
(USED INDEX COLUMN)) |
|
|
FIRSTNAME |
(USED INDEX COLUMN)) |
|
|
FULL_NAME_INDEX |
EQUAL CONDITION FOR INDEX |
|
|
|
ADDNL. QUALIFICATION ON INDEX |
|
|
NAME |
(USED INDEX COLUMN)) |
|
|
FIRSTNAME |
(USED INDEX COLUMN)) |
|
|
|
RESULT IS
COPIED、 |
14 |
その他の SQL 文の簡単な例については、SQL チュートリアルを参照してください。
参照: