低效
:
SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR
REGION = “MELBOURNE”
如果你坚持要用
OR,
那就需要返回记录最少的索引列写在最前面
.
2.
不用“
<>”
或者“
!=”
操作符。对不等于操作符的处理会造成全表扫描,可以用“
<” or “>”
代
替
。
例如:
a<>0
改为
a>0 or a<0
a<>’’
改为
a>’’
3.Where
子句中出现
IS NULL
或者
IS NOT NULL
时,
Oracle
会停止使用索引而执行全表
扫描。
可以考虑在设计表时,对索引列设置为
NOT NULL
。这样就可以用其他操作来取代判断
NULL
的操作
用其它相同功能的操作运算代替,如:
1
、
a is not null
改为
a>0
或
a>’’
等。
2
、不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,
缺省为申请。
3
、
建立位图索引(有分区的表不能建,位图索引比较难控制,如字段值太多索引会使
性能下降,多人更新操作会增加数据块锁的现象)
如果某列存在空值,即使对该列建索引也不会提高性能。任何在
WHERE
子句中使用
is
null
或
is not null
的语句优化器是不允许使用索引的。
4
、当通配符“
%”
或者“
_”
作为查询字符串的第一个字符时,索引不会被使用
.
例如:
select u.name from user u where u.name like '%huang%'
应该改为:
select u.name from user u where u.name like 'huang%'
5
、对于有连接的列“
||”
,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者
使用不作用在列上的函数替代。
6
、如果索引不是基于函数的,那么当在
Where
子句中对索引列使用函数时,索引不再起
作用。
例如:
creadate
有索引
查询:
select a.paicUmNum from ps_NumBer a where to_char(a.creadate,'yyyy-MM-
dd')>'2010-10-12'
不使用索引
select a.paicUmNum from ps_NumBer a where a.creadate>to_date('2010-10-12','yyyy-
MM-dd')
使用索引
评论