SQL|Oracle SQL性能优化最常用的40条建议( 四 )

AND EMP_CAT > 'A'
这里, ORACLE只用到了DEPT_NO索引. 执行路径如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX
7)强制索引失效
如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) 。
SELECT ENAME
FROM EMP
WHERE EMPNO = 7935
AND DEPTNO + 0 = 10 /*DEPTNO上的索引将失效*/
AND EMP_TYPE || '' = 'A' /*EMP_TYPE上的索引将失效*/
8)避免在索引列上使用计算
WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
/*低效SQL*/
SELECT * FROM DEPT
WHERE SAL * 12 > 25000;
/*高效SQL*/
SELECT * FROM DEPT
WHERE SAL > 25000/12;
9)自动选择索引
如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性索引。在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引。
SELECT ENAME FROM EMP
WHERE EMPNO = 2326
AND DEPTNO = 20;
这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录。
SELECT ENAME FROM EMP
WHERE EMPNO = 2326
AND DEPTNO = 20;
10)避免在索引列上使用NOT
通常,我们要避免在索引列上使用NOT,NOT会产生在和在索引列上使用函数相同的影响。当ORACLE遇到NOT,它就会停止使用索引转而执行全表扫描。
/*低效SQL: (这里,不使用索引)*/
SELECT * FROM DEPT
WHERE NOT DEPT_CODE = 0
/*高效SQL: (这里,使用索引)*/
SELECT * FROM DEPT
WHERE DEPT_CODE > 0
24. 用 >= 替代 >
如果DEPTNO上有一个索引:
/*高效SQL*/
SELECT * FROM EMP
WHERE DEPTNO >=4
/*低效SQL*/
SELECT * FROM EMP
WHERE DEPTNO >3
两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录,而后者将首先定位到DEPTNO等于3的记录并且向前扫描到第一个DEPT大于3的记录。
25. 用Union替换OR(适用于索引列)
通常情况下,用UNION替换WHERE子句中的OR将会起到较好的效果。对索引列使用OR将造成全表扫描。注意,以上规则只针对多个索引列有效。
/*高效SQL*/
SELECT LOC_ID , LOC_DESC , REGION
FROMLOCATION
WHERE LOC_ID = 10
UNIONS
ELECT LOC_ID , LOC_DESC , REGION
FROMLOCATION
WHERE REGION = 'MELBOURNE'
/*低效SQL*/
SELECT LOC_ID,LOC_DESC,REGION
FROMLOCATION
WHERE LOC_ID = 10
OR REGION = 'MELBOURNE'
26. 用IN替换OR
/*低效SQL*/
SELECT*FROMLOCATION
WHERE LOC_ID = 10
OR LOC_ID = 20
OR LOC_ID = 30
/*低效SQL*/
SELECT*FROMLOCATION
WHERE LOC_ID = 10
OR LOC_ID = 20
OR LOC_ID = 30
实际的执行效果还须检验,在ORACLE8i下, 两者的执行路径似乎是相同的。
27. 避免在索引列上使用is 和is not
避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引。
/*低效SQL:(索引失效)*/
SELECT * FROM DEPARTMENT
WHERE DEPT_CODE IS NOT ;
/*高效SQL:(索引有效)*/
SELECT * FROM DEPARTMENT
WHERE DEPT_CODE >=0;
28. 总是使用索引的第一个列
如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时, 优化器才会选择使用该索引。
SQL> create index multindex on multiindexusage(inda,indb);Index created.
SQL> select * from multiindexusage where indb = 1;Execution Plan
----------------------------------------------------------


推荐阅读