私はオラクルの説明計画を理解しようとしていましたが、説明計画を作成する際にオラクルが考慮する条件を知りたいと思っていました。
Oracle 11gに存在するHRスキーマで単純なクエリをテストしていました
select * from countries
where region_id in (select region_id from regions where region_name = 'Europe');
次のクエリを実行したとき:
explain plan for
select * from countries
where region_id in (select region_id from regions where region_name = 'Europe');
SELECT * FROM table(dbms_xplan.display(null,null,'basic'));
説明テーブルに次の出力が表示されました。
--------------------------------------------------------
| Id | Operation | Name |
--------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | INDEX FULL SCAN | COUNTRY_C_ID_PK |
| 3 | TABLE ACCESS BY INDEX ROWID| REGIONS |
| 4 | INDEX UNIQUE SCAN | REG_ID_PK |
--------------------------------------------------------
ここで、外側のクエリが最初に実行されたことを確認しました。つまり、行 3 で示されているように、countries テーブルが最初に実行されました。
ここで、regions テーブルの region_name にインデックスを追加し、説明計画を再度実行して、次の出力を得ました。
--------------------------------------------------------------
| Id | Operation | Name |
--------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | TABLE ACCESS BY INDEX ROWID| REGIONS |
| 3 | INDEX RANGE SCAN | REGIONNAME_REGIONS_IX |
| 4 | INDEX UNIQUE SCAN | COUNTRY_C_ID_PK |
| 5 | INDEX RANGE SCAN | COUNTRIES_REGIONID_IX |
--------------------------------------------------------------
今私の質問は:
- インデックスが存在するかどうかに関係なく、最初に内部クエリを実行するべきではありませんか
- インデックスを追加すると実行計画が変更される場合、それを変更できる他の機能は何ですか?
- 一般的に、実行プロセスはどのようなものですか? (最初に発生する結合を最初に実行し、次にクエリ内の次の結合に進みます) ?
よろしくお願いします。
-ヴァルン