为什么在查询中使用IS NULL 或IS NOT NULL同样会限制索引的使用
简答的说因为索引键值不会存储空值
Oracle的CBO并不会因为SQL语句中指定了IS NOT NULL或IS NULL操作就不再使用索引。CBO选择索引的条件只有正确性和代价,只要满足这两个条件就可以了。
测试案例
以dba_objects表的数据建一个测试表为T
create table t as select * from dba_objects;
将data_object_id=2的object_name列更改为null
update t set object_name =null where data_object_id=2 and (object_id <20 or object_id>20)
创建object_name列的索引
create index index_objecton on t(object_name)
B树索引不存储键值全为空的记录。所以对于单列索引而言,确实IS NULL操作是无法使用索引的
----------------------------------------------------------------------------------------------------
Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522
-----------------------------------------------