SQL语句编写注意问题

本文介绍了Oracle数据库中索引使用的七大限制因素,包括ISNULL与ISNOTNULL的使用、联接列、函数作用于索引列、带通配符(%)的LIKE语句等,并给出了相应的优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 通常查询速度快的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值