WEB开发网
开发学院数据库Oracle 通过分析SQL语句的执行计划优化SQL(七) 阅读

通过分析SQL语句的执行计划优化SQL(七)

 2007-08-06 12:37:07 来源:WEB开发网   
核心提示: 如下列所示:SQL> explain plan for select empno,ename from emp where empno=10;Query PlanSELECT STATEMENT [CHOOSE] Cost=1TABLE ACCESS BY ROWID EMP [AN

如下列所示:

SQL> explain plan for select empno,
ename from emp where empno=10;
Query Plan
--------------------------------
SELECT STATEMENT [CHOOSE] Cost=1
TABLE ACCESS BY ROWID EMP [ANALYZED]
  INDEX UNIQUE SCAN EMP_I1

注意TABLE ACCESS BY ROWID EMP部分,这表明这不是通过FTS存取路径访问数据,而是通过rowid lookup存取路径访问数据的。在此例中,所需要的rowid是由于在索引查找empno列的值得到的,这种方式是INDEX UNIQUE SCAN查找,后面给予介绍,EMP_I1为使用的进行索引查找的索引名字。

但是如果查询的数据能全在索引中找到,就可以避免进行第2步操作,避免了不必要的I/O,此时即使通过索引扫描取出的数据比较多,效率还是很高的,因为这只会在索引中读取。所以上面我在介绍基于规则的优化器时,使用了select count(id) from SWD_BILLDETAIL where cn <'6',而没有使用select count(cn) from SWD_BILLDETAIL where cn <'6'。因为在实际情况中,只查询被索引列的值的情况极为少,所以,如果我在查询中使用count(cn),则不具有代表性。

SQL> explain plan for select empno
from emp where empno=10;
-- 只查询empno列值
Query Plan
-------------------------------
SELECT STATEMENT [CHOOSE] Cost=1
 INDEX UNIQUE SCAN EMP_I1

进一步讲,如果sql语句中对索引列进行排序,因为索引已经预先排序好了,所以在执行计划中不需要再对索引列进行排序:

SQL> explain plan for select
empno, ename from emp
where empno > 7876 order by empno;
Query Plan
----------------------------------
SELECT STATEMENT  [CHOOSE] Cost=1 
TABLE ACCESS BY ROWID EMP [ANALYZED]
 INDEX RANGE SCAN EMP_I1 [ANALYZED]

从这个例子中可以看到:因为索引是已经排序了的,所以将按照索引的顺序查询出符合条件的行,因此避免了进一步排序操作。

上一页  1 2 3 

Tags:通过 分析 SQL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接