1)IS NULL 与 IS NOT NULL
任何SQL语句,只要在where子句中使用了is null或is not null,那么Oracle优化器就不允许使用索引了。
2)联接列(||)
对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的,例如
select *
from employss
where first_name||''||last_name ='Beill Cliton';
此时系统优化器对基于last_name 创建的索引没有使用,应调整为
select *
from employss
where first_name ='Beill' and last_name ='Cliton';
3)函数的使用
当有函数作用于索引列上时,索引将失效
4)带通配符(%)的like 语句
通配符(%)在搜寻词首出现时,Oracle不能使用索引,例如
select * from employee where last_name like '%cliton%';
其它时候则能使用,例如,
select * from employee where last_name like 'c%';
5)order by语句
尽量避免使用表达式,为使用的列建立索引。
6)NOT
用于对任何逻辑运算符取反,例如
where not (status ='VALID')
<=> where status <>'INVALID'
此时将不使用索引,例如
select * from employee where salary<>3000;
它将不会使用索引,应改成
select * from employee where salary<3000 or salary>3000;
7)IN和EXISTS
尽量使用EXISTS而不是IN
通过使用EXIST,Oracle 系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle 系统在执行IN 子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS 比使用IN 通常查询速度快的原因。
SQL语句编写注意问题
猜你喜欢
转载自orange5458.iteye.com/blog/1974325
今日推荐
周排行