`
yaozuodaoforfly
  • 浏览: 114172 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

索引在哪些条件下会失效

 
阅读更多
IS NULL 或IS NOT NULL操作(判断字段是否为空)
判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。 
SELECT *
FROM   mtl_material_transactions mmt
WHERE  mmt.shipment_number IS NOT NULL

> 及 < 操作符(大于或小于操作符) 
大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找。
但有的情况下可以对它进行优化,如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录索引。    

like '%xx'将不使用索引,但like 'xx%'可以使用索引 
不使用索引 
SELECT *
FROM   mtl_material_transactions mmt
WHERE  mmt.shipment_number LIKE  '%12806557'    

‘!=’ 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.   
不使用索引:  
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’;  

在这边测试时有使用索引 
使用索引:  
SELECT ACCOUNT_NAME,AMOUNT   
FROM TRANSACTION  
WHERE ACCOUNT_NAME = ‘AMEX’    
AND ACCOUNT_TYPE=’ A’;    

‘+’是数学函数. 就象其他数学函数那样, 停用了索引.  
不使用索引:  
SELECT ACCOUNT_NAME, AMOUNT 
FROM TRANSACTION 
WHERE AMOUNT + 3000 >5000;  

使用索引:  
SELECT ACCOUNT_NAME, AMOUNT 
FROM TRANSACTION 
WHERE AMOUNT > 2000 ;

相同的索引列不能互相比较,这将会启用全表扫描.  
不使用索引:  
SELECT ACCOUNT_NAME, AMOUNT 
FROM TRANSACTION 
WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);  

使用索引:  
SELECT ACCOUNT_NAME, AMOUNT 
FROM TRANSACTION 
WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,’%’);    

使用UPPER,TO_NUMBER也会导致索引失效 
不使用索引 
SELECT *
FROM   mtl_material_transactions mmt
WHERE  UPPER(mmt.shipment_number) ='12806557'    

NOT IN将会导致索引失效 
不使用索引 
SELECT *
FROM   mtl_material_transactions mmt
WHERE  mmt.shipment_number IN ('12806557')
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics