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
----------------------------------------------------------
推荐阅读
- 性能|vivo X50 Pro+拍摄性能评测 镜头算法性能缺一不可
- 打印需求|性能提升 爱普生A3+彩色墨仓式复合机新品上市
- Apple|性能无视对手!苹果A14芯片谍照首曝光:5nm工艺制程加持
- 新浪科技综合@F2.8超广变焦 索尼G大师SEL1224GM性能测评新浪科技综合2020-07-20 06:54:170阅
- 综艺节目|乘风破浪的姐姐们战斗性能力有多强?看逐渐软弱下来的阿kenn导师就知道了
- 方案|性能全面的尼康Z50,什么配件值得买?官方推荐这套配件方案
- AMD|7nm Navi上市一年 AMD点评自家显卡:性能领先N卡20%
- OPPO|鲁大师手机性能排行榜:OPPO Ace2第一,小米10 Pro上榜!
- 高性能|为何异型高性能航母难以诞生?造价太高与失败的代价过于惨重
- 性能|鲁大师发布2020年第二季度显卡性能榜单,前三名均来自英伟达