Where子句

需要当心的WHERE子句

某些SELECT 句中的WHERE子句不使用索引。 里有一些例子。

在下面的例子里, ‘!=’ 将不使用索引。 , 索引只能告你什存在于表中, 而不能告你什不存在于表中。


不使用索引:

SELECT ACCOUNT_NAME

FROM TRANSACTION

WHERE AMOUNT !=0;

使用索引:

SELECT ACCOUNT_NAME

FROM TRANSACTION

WHERE AMOUNT >0;


 

下面的例子中, ‘||’是字符接函数。 就象其他函数那, 停用了索引。

不使用索引:

SELECT ACCOUNT_NAME,AMOUNT

FROM TRANSACTION

WHERE ACCOUNT_NAME||ACCOUNT_TYPE=’AMEXA’;

 

避免在索引列上使用NOT

要避免在索引列上使用NOT, NOT生在和在索引列上使用函数相同的影响。当ORACLE”遇到”NOT,他就会停止使用索引行全表描。

避免在索引列上使用计算

WHERE子句中,如果索引列是函数的一部分。化器将不使用索引而使用全表描。


低效:

SELECT … FROM  DEPT  WHERE SAL * 12 > 25000;

高效:

SELECT … FROM DEPT WHERE SAL > 25000/12;


 

避免在索引列上使用IS NULLIS NOT NULL

避免在索引中使用任何可以空的列,ORACLE将无法使用索引。


低效: (索引失效)

SELECT … FROM DEPARTMENT

WHERE DEPT_CODE IS NOT NULL;

高效: (索引有效)

SELECT … FROM DEPARTMENT

WHERE DEPT_CODE >=0;


 

避免改变索引列的类型

当比不同数据型的数据, ORACLE动对简单转换

EMPNO是一个数值类型的索引列。

SELECT …

FROM EMP

WHERE EMPNO = ‘123’

实际,经过ORACLE转换, :

SELECT …

FROM EMP

WHERE EMPNO = TO_NUMBER(‘123’)

幸运的是,转换没有生在索引列上,索引的用途没有被改

 

,EMP_TYPE是一个字符型的索引列。

SELECT …

FROM EMP

WHERE EMP_TYPE = 123

句被ORACLE转换为:

SELECT …

FROM EMP

WHERE TO_NUMBER(EMP_TYPE)=123

 

内部生的转换, 个索引将不会被用到!

了避免ORACLE你的SQL式的转换, 最好把转换式表出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值