打印本文 打印本文 关闭窗口 关闭窗口
ORACLE SQL性能优化系列 (十二)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2359  更新时间:2009/4/22 22:08:12  文章录入:mintao  责任编辑:mintao

39.       总是使用索引的第一个列

如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引.

 

译者按:

这也是一条简单而重要的规则. 见以下实例.

 

SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));

Table created.

SQL> create index multindex on multiindexusage(inda,indb);

Index created.

SQL> set autotrace traceonly

 

SQL>  select * from  multiindexusage where inda = 1;

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE

   1    0   TABLE ACCESS (BY INDEX ROWID) OF ''''MULTIINDEXUSAGE''''

   2    1     INDEX (RANGE SCAN) OF ''''MULTINDEX'''' (NON-UNIQUE)

 

SQL> select * from  multiindexusage where indb = 1;

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE

   1    0   TABLE ACCESS (FULL) OF ''''MULTIINDEXUSAGE''''

  

很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引

 

 

40.       ORACLE内部操作

当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作.

ORACLE Clause

内部操作

ORDER BY

SORT ORDER BY

UNION

UNION-ALL

MINUS

MINUS

INTERSECT

INTERSECT

DISTINCT,MINUS,INTERSECT,UNION

SORT UNIQUE

MIN,MAX,COUNT

SORT AGGREGATE

GROUP BY

SORT GROUP BY

ROWNUM

COUNT or COUNT STOPKEY

Queries involving Joins

SORT JOIN,MERGE JOIN,NESTED LOOPS

CONNECT BY

CONNECT BY

 

 

41.       用UNION-ALL 替换UNION ( 如果有可能的话)

 

当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序.

如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高.

 

[1] [2] [3]  下一页

打印本文 打印本文 关闭窗口 关闭窗口