加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 百科 > 正文

了解oracle中的解释计划

发布时间:2021-01-16 20:43:12 所属栏目:百科 来源:网络整理
导读:我试图理解oracle中的解释计划,并想知道oracle在形成解释计划时考虑了什么条件 我正在测试oracle 11g中存在的HR模式中的简单查询 select * from countries where region_id in (select region_id from regions where region_name = 'Europe'); 当我运行以

我试图理解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流程的一些问题,并且没有记录供全球使用.

在第一个问题中,并非必然,它都是基于成本的.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读