关于Oracle优化器的几个问题
时间:2011-09-23
来源:互联网
前段时间在网上下载了一个关于Oracle优化器的文档,原文是这样的:
“如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。”
再看下一段:
“选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。”
随后用SCOTT用户测试了一下,现在我没有运行过analyze命令,所以按照原文说的,现在的ORACLE优化器是基于规则的(RULE),所以ORACLE会按照如上的方式来处理连接,看执行计划
SQL code
问题一:完全是一样的执行计划,先对EMP全表扫描,然后对DEPT索引扫描,然后做连接,没看到效果?
问题二:项目开发中,需要更改ORACLE的优化器吗?
问题三:RULE和COST两种优化器如何去选择?
谢谢
“如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。”
再看下一段:
“选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。当ORACLE处理多个表时, 会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。”
随后用SCOTT用户测试了一下,现在我没有运行过analyze命令,所以按照原文说的,现在的ORACLE优化器是基于规则的(RULE),所以ORACLE会按照如上的方式来处理连接,看执行计划
SQL code
EXPLAIN PLAN FOR SELECT e.ENAME,d.DNAME FROM EMP e,DEPT d WHERE e.deptno=d.deptno; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 351108634 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 308 | 4 (0)| 00 | 1 | NESTED LOOPS | | 14 | 308 | 4 (0)| 00 | 2 | TABLE ACCESS FULL | EMP | 14 | 126 | 3 (0)| 00 | 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)| 00 |* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00 -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("E"."DEPTNO"="D"."DEPTNO") EXPLAIN PLAN FOR SELECT e.ENAME,d.DNAME FROM DEPT d,EMP e WHERE e.deptno=d.deptno; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY()); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 351108634 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Ti -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 308 | 4 (0)| 00 | 1 | NESTED LOOPS | | 14 | 308 | 4 (0)| 00 | 2 | TABLE ACCESS FULL | EMP | 14 | 126 | 3 (0)| 00 | 3 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 13 | 1 (0)| 00 |* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00 -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("E"."DEPTNO"="D"."DEPTNO")
问题一:完全是一样的执行计划,先对EMP全表扫描,然后对DEPT索引扫描,然后做连接,没看到效果?
问题二:项目开发中,需要更改ORACLE的优化器吗?
问题三:RULE和COST两种优化器如何去选择?
谢谢
作者: ghsau 发布时间: 2011-09-23
自己顶,现在CSDN怎么发帖就给我贴广告呢,记得以前是回复量高的时候才加
作者: ghsau 发布时间: 2011-09-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28