SQL オプティマイザは、絶対に必要になるまでできるだけ結果テーブルを登録しません。
結果テーブルを登録する必要がない場合、検索は FETCH 時間まで延期することができます。この方法により、結果用としてメモリは使用されないため、最初の結果に迅速にアクセスすることができます。
ただし、状況によっては常に結果テーブルを登録する必要があるため、常に検索を FETCH 時間まで延期できるとは限りません。
● 複数のテーブルに対する SELECT (結合)
● SELECT ...FOR REUSE
一般的に、結果テーブルを登録する必要があるのは以下の場合です。
● SELECT DISTINCT ...
● SELECT ...ORDER BY ...
以下のすべての条件が当てはまる場合、結果テーブルを登録する必要はありません。
● DISTINCT 指定 (いくつかの例外あり) または構文要素 FOR REUSE が指定されていない場合。
● ソート対象の列が指定した順序と指定したソート順 (昇順または降順) で索引を構成している場合。
例
SQL オプティマイザを説明するために使用する例は、スキーマ HOTEL におけるデモデータベースDEMODB とそのデモデータにもとづいています。
データベースシステムのコンセプト、スキーマ HOTEL のオブジェクト
EXPLAIN 文を使用して、結果テーブルが登録されるか (列 STRATEGY RESULT IS COPIED のエントリ) 登録されないか (列 STRATEGY: RESULT IS NOT COPIED のエントリ) を確認することができます。
SELECT zip, name FROM
hotel.city
WHERE ROWNO < 5
ORDER BY name, zip DESC
修飾:
ROWNO <
5 ORDER BY name, zip DESC
テーブル CITY
の一次キー:
zip
修飾列の索引:
なし
使用される検索方針: TABLE SCAN
EXPLAIN 文の結果
TABLENAME |
COLUMN_OR_INDEX |
STRATEGY |
PAGECOUNT |
CITY |
|
TABLE SCAN |
11 |
|
|
RESULT IS COPIED |
|
結果テーブルが登録されます (RESULT IS COPIED)。
その他の SQL 文の簡単な例については、SQL チュートリアルを参照してください。
参照:
結合の検索方針
SQL 参照マニュアル、FETCH 文 (fetch_statement)、DISTINCT 指定 (distinct_spec)、SELECT 文 (select_statement)