我试图理解oracle中的解释计划,并想知道oracle在形成解释计划时考虑了什么条件
我正在测试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'));
我在explain表中得到了以下输出:
--------------------------------------------------------
| 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行所示.
现在,我在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 |
--------------------------------------------------------------
现在我的问题是:
>不管是否存在索引,都不应该首先执行内部查询
>如果添加索引会改变执行计划,还有哪些其他功能可以改变它?
>在一般情况下,执行过程是什么样的顺序(首先执行首先发生的连接然后转到查询中的下一个连接)?
在此先感谢您的帮助.
-Varun