我想了解在Oracle的解释计划,想知道而形成的解释计划了解在Oracle的解释计划
我是测试在HR模式目前在Oracle 11g中
一个简单的查询哪些条件甲骨文认为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.
现在我增加了一个索引上的区域表的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