本文详细介绍Oracle语句优化规则汇总(7)
1. 避免在索引列上使用计算
WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
举例:
低效:
SELECT…
FROMDEPT
WHERESAL*12>25000;
高效:
SELECT…
FROMDEPT
WHERESAL>25000/12;
:这是一个非常实用的规则,请务必牢记
2. 自动选择索引
如果表中有两个以上(包括两个)索引,其中有一个唯一性索引,而其他是非唯一性。
在这种情况下,ORACLE将使用唯一性索引而完全忽略非唯一性索引。
举例:
SELECTENAME
FROMEMP
WHEREEMPNO=2326
ANDDEPTNO=20;
这里,只有EMPNO上的索引是唯一性的,所以EMPNO索引将用来检索记录。
TABLEACCESSBYROWIDONEMP
INDEXUNIQUESCANONEMP_NO_IDX
3. 避免在索引列上使用NOT
通常,我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的影响。 当ORACLE“遇到”NOT,他就会停止使用索引转而执行全表扫描。
举例:
低效: (这里,不使用索引)
SELECT…
FROMDEPT
WHEREDEPT_CODENOT=0;
高效: (这里,使用了索引)
SELECT…
FROMDEPT
WHEREDEPT_CODE>0;
需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符。
NOT > to <=
NOT >= to <
NOT < to >=
NOT <= to >
:在这个例子中,作者犯了一些错误。 例子中的低效率SQL是不能被执行的。
我做了一些测试:
SQL> select * from emp where NOT empno > 1;
no rows selected
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)
SQL> select * from emp where empno <= 1;
no rows selected
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP'
2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE)
两者的效率完全一样,也许这符合作者关于“ 在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符” 的观点。
4. 用>=替代>
如果DEPTNO上有一个索引,
高效:
SELECT*
FROMEMP
WHEREDEPTNO>=4
低效:
SELECT*
FROMEMP
WHEREDEPTNO>3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。
来源:豆豆网转载 作者:IT专家网 Peak Wong 责编:豆豆技术应用
- 有备无患 快速自制救急Windows恢复盘
- 缓存“搬”到内存上,xp也玩超级兔子
- 找回用Ghost备份的XP系统备份文件
- SQL Server Analysis Service 2005性能优化检查点
- 酷狗2008测试版编辑试用手记
- SQL Server Analysis Service中Cube的结构
- Oracle语句优化规则汇总(7)
- Photoshop CS3打造动态燃烧火焰字
- Oracle语句优化规则汇总(6)
- 三分钟理解Flash中的level层级关系