SQL 文に索引列の検索条件が含まれる場合、SQL オプティマイザは、以下の検索方針を使用することができます。
検索条件 |
SQL オプティマイザの検索方針 |
索引列の等価条件 |
関連する倒置一覧にキーが含まれる行にアクセスします。 |
索引列の IN 条件 |
倒置一覧にキーが含まれる行にアクセスします。 |
2 つの範囲制限 (上限または下限) のどちらかについて 1 つの条件のみ (<、<=、>、>=) を持つ範囲条件 |
範囲によって決められた倒置一覧にキーが含まれる行にアクセスします。 |
両範囲制限が指定されている範囲条件。AND によってリンクされた同じ列に対して BETWEEN 演算子と 2 つの条件 (<= または >=) のどちらを使用してこの指定が行われているかは、検索方針の選択とは関係ありません。 |
範囲によって決められた倒置一覧にキーが含まれる行にアクセスします。 |
等価/IN 条件と範囲条件の場合、必要なすべての値がすでに倒置一覧に含まれているため、行にアクセスする必要がないクエリも存在します。
例
SQL オプティマイザを説明するために使用する例は、スキーマ HOTEL におけるデモデータベースDEMODB とそのデモデータにもとづいています。
データベースシステムのコンセプト、スキーマ HOTEL のオブジェクト
SELECT * FROM hotel.customer
WHERE name = 'Wagner'
修飾:
name =
'Wagner'
テーブル CUSTOMER
の一次キー:
cno
修飾列の索引:
FULL_NAME_INDEX
(name, firstname)
使用される検索方針: RANGE CONDITION FOR
INDEX
等価条件は最初の索引列にのみ入力されるため、この SQL 文は RANGE CONDITION を使用して処理する必要があります。索引には値 Wagner を持つエントリが複数存在する場合があります。
開始キーは、最初の索引列の等価条件を満たす最初のレコード (Wagner) に設定されます。終了キーは、条件を満たさない最初のレコード (Walker) にあります。
EXPLAIN 文の結果
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CUSTOMER |
FULL_NAME_INDEX |
RANGE CONDITION FOR INDEX |
34 |
|
NAME |
(USED INDEX COLUMN) |
|
|
|
RESULT IS
NOT COPIED、 |
|
SELECT * FROM hotel.customer
WHERE name IN ('Smith', 'Miller')
修飾:
name = IN
('Smith', 'Miller')
テーブル CUSTOMER
の一次キー:
cno
修飾列の索引:
FULL_NAME_INDEX
(name, firstname)
使用される検索方針: IN CONDITION FOR
INDEX
SQL 文は IN 条件を使用して処理されます。SQL オプティマイザは、対応する RANGE 条件も評価しますが、この条件は指定した値に対して最もコストが大きくなります。
EXPLAIN 文の結果
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CUSTOMER |
FULL_NAME_INDEX |
IN CONDITION FOR INDEX |
34 |
|
NAME |
(USED INDEX COLUMN) |
|
|
|
RESULT IS
NOT COPIED、 |
|
ENO 列を使用して 1 列の索引EMPLOYEE_ENO を登録します。
参照:
SQL 参照マニュアル、CREATE INDEX 文 (create_index_statement)
SELECT eno, hno FROM
hotel.employee
WHERE eno >= 8
修飾:
eno =
8
テーブル EMPLOYEE
の一次キー:
hno、eno
修飾列の索引:
EMPLOYEE_ENO
(eno)
使用される検索方針: RANGE CONDITION FOR
INDEX
SELECT 一覧に入力できるのは索引と一次キーの列のみであり、一次キー列は索引ツリーにも保存されるため、この SQL 文は INDEX ONLY 方針を使用して処理することができます。
アクセスは索引EMPLOYEE_ENO を使用して行われます。開始キーは、“以上” 条件を満たす最初のレコード (値 8) に設定されます。停止キーは、索引の最後のレコードに設定されます。
EXPLAIN 文の結果
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
EMPLOYEE |
EMPLOYEE_ENO |
RANGE CONDITION FOR INDEX |
45 |
|
|
ONLY INDEX ACCESSED |
|
|
ENO |
(USED INDEX COLUMN) |
|
|
|
RESULT IS
NOT COPIED、 |
|
BETWEEN 条件の場合、停止キーは、索引の最後ではなく、RANGE 条件を満たす最後のエントリに設定されます。
その他の SQL 文の簡単な例については、SQL チュートリアルを参照してください。
参照: