我试图了解 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'));
我在解释表中得到以下输出:
--------------------------------------------------------
| 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 |
--------------------------------------------------------------
现在我的问题是:
- 不管索引是否存在,不应该首先执行内部查询
- 如果添加索引会改变执行计划,还有哪些其他功能可以改变它?
- 在一般情况下,执行过程是什么样的,它是顺序的(首先执行首先发生的连接,然后进入查询中的下一个连接)?
在此先感谢您的帮助。
-瓦伦