了解oracle中的解释计划
我试图理解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 解决方法解释计划在很大程度上依赖于基于成本的优化器(CBO).您可以通过收集要查询的表的统计信息来帮助完成此过程.现在就索引为什么会改变计划而言,这是因为你已经向CBO提供了之前没有的关键信息.这相当于我问你这个问题:没有索引: 有索引: 第二个问题提供了更大的背景,因此你可以更快地演绎,而且你不必枚举所有这些街道的东西. 您可以提供查询提示,即: 从表中选择/ * parallel * / * 对于第三个问题,我想象的是Oracle流程的一些问题,并且没有记录供全球使用. 在第一个问题中,并非必然,它都是基于成本的. (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |