关于btree索引不能正常使用问题

 

select count(1) from internet_act t  这个SQL查下来居然不会使用internet_act_indx_1
SELECT STATEMENT, GOAL = CHOOSE   Cost=7796 Cardinality=6619756 Bytes=40870373544
 TABLE ACCESS FULL Object owner=UCLOODEV Object name=INTERNET_ACT Cost=7796 Cardinality=6619756 Bytes=40870373544
除非后面使用where xxx < xxx
 
查原因发现如下

由于B*Tree索引不存储Null值,所以在索引字段允许为空的情况下,某些Oracle查询不会使用索引.

很多时候,我们看似可以使用全索引扫描(Full Index Scan)的情况,可能Oracle就会因为Null值的存在而放弃索引.

在此情况下即使使用Hints,Oracle也不会使用索引,其根本原因就是因为Null值的存在.

当索引字段允许为Null时,Oracle放弃此索引

当该字段为Not Null时,索引可以被强制使用

 

 

 

以下为网上查来的资料

Posted by: eygle at February 23, 2006 09:48 AM

ref:"由于B*Tree索引不存储Null值,所以在索引字段允许为空的情况下,Oracle查询不会使用索引."
这种情况只影响强制使用索引hints而又无此字段的where条件时,当select语句中的where条件包含此字段的expression时一样可以使用此索引!
反之,按本文的说法,我们岂不是只能在非空字段上建索引了?!事实是我们可以在我们任意想要建索引的字段上建索引,只要你认为必要,无需关注其是否not null!
不同的是,is null条件是当然是不查B*Tree索引的,Bitmap索引则可以。

Posted by: xsb at February 28, 2006 10:28 AM

ref:"由于B*Tree索引不存储Null值,所以在索引字段允许为空的情况下,Oracle查询不会使用索引."
这种情况只影响强制使用索引hints而又无此字段的where条件时,当select语句中的where条件包含此字段的expression时一样可以使用此索引!
反之,按本文的说法,我们岂不是只能在非空字段上建索引了?!事实是我们可以在我们任意想要建索引的字段上建索引,只要你认为必要,无需关注其是否not null!
不同的是,is null条件当然是不查B*Tree索引的,Bitmap索引则可以。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值