oracle is null效率,对于IS NULL条件的优化

文章探讨了在海量数据表中如何优化查找字段为NULL的记录。通过创建复合索引,尤其是包含非空字段的复合索引,或者使用固定值复合索引,可以改善ISNULL条件的查询性能。示例展示了如何修改表结构和建立不同类型的索引来优化执行计划。
摘要由CSDN通过智能技术生成

单字段索引中,字段的NULL值是不存放与INDEX中的,因此WHERE中的IS NULL条件一般情况下无法使用INDEX来优化,那么,当需要从一个海量数据表中查找某个字段IS NULL的少量记录时如何进行优化呢?

1) 利用复合索引,如果索引中至少有一个字段是非空字段,则即使其他字段是NULL值,整条记录仍然会被索引;

2) 如果没有合适的非空字段可以建立复合索引时,利用固定值复合索引。

下面给出一个例子:

建一个测试表test10,此时object_id和ojbect_name字段都是可以为空的:

create table test10 as select object_id,object_name,object_type from dba_objects;

为object_name字段建立索引:

create index idx_test10_1 on test10(object_name);

检查SQL的执行计划:

--------------------------------------------------------------------

| Id  | Operation            |  Name      | Rows  | Bytes | Cost  |

--------------------------------------------------------------------

|  0 | SELECT STATEMENT    |            |    1 |    29 |    5 |

|*  1 |  TABLE ACCESS FULL  | TEST10      |    1 |    29 |    5 |

--------------------------------------------------------------------

将object_id改成非空,再建立复合索引:

alter table test10 modify object_id not null;

create index idx_test10_2 on test10(object_name,object_id);

检查SQL的执行计划:

-----------------------------------------------------------------------------

| Id  | Operation                  |  Name        | Rows  | Bytes | Cost  |

-----------------------------------------------------------------------------

|  0 | SELECT STATEMENT            |              |    1 |    29 |    1 |

|  1 |  TABLE ACCESS BY INDEX ROWID| TEST10        |    1 |    29 |    1 |

|*  2 |  INDEX RANGE SCAN          | IDX_TEST10_2  |    1 |      |    1 |

-----------------------------------------------------------------------------

删掉复合索引,建立一个固定值复合索引:

drop index idx_test10_2;

create index idx_test10_2 on test10(object_name,1);

检查SQL的执行计划:

-----------------------------------------------------------------------------

| Id  | Operation                  |  Name        | Rows  | Bytes | Cost  |

-----------------------------------------------------------------------------

|  0 | SELECT STATEMENT            |              |    1 |    31 |    1 |

|  1 |  TABLE ACCESS BY INDEX ROWID| TEST10        |    1 |    31 |    1 |

|*  2 |  INDEX RANGE SCAN          | IDX_TEST10_2  |    1 |      |    1 |

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值