我试图理解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