oracle 空值 走索引吗,Oracle中NULL值与索引

NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种值,通常称为UNKNOWN或空值,即是未知的,不确定的。由于NULL存在着无数的可能,因此NULL值也不等于NULL值,所以与NULL值相关的操作同样都为NULL值。正是基于这样一个特性,对于NULL值列上的B树索引导致了is null/is not null不走索引的情形,下面描述了NULL值与索引以及索引NULL列上的执行计划,如何使得NULL值走索引的情形。注:本文仅仅讨论的是B树索引上的NULL值,位图索引不在此范围之内。

一、null值与索引

SQL> create table test(id number(2),name varchar2(10),age number(2));

SQL> create unique index test_id_ind on test(id);

//id上存在唯一索引,但由于null值不等于null值,因此能成功插入

SQL> insert into test(id,name,age) values(null,'test1',10);

SQL> insert into test(id,name,age) values(null,'test2',10);

SQL> commit;

//在test表上创建唯一复合索引,基于id,name列

SQL> create unique index test_id_name_ind on test(id,name);

//基于多列的复合索引,不全为null的重复行则不能被插入

SQL> insert into test(id,name,age) values(null,'test1',20);

insert into test(id,name,age) values(null,'test1',20)

*

第 1 行出现错误:

ORA-00001: 违反唯一约束条件 (SCOTT.TEST_ID_NAME_IND)

//(null,null)不等同于(null,null),所以的两次null能够被插入。

SQL> insert into test(id,name,age) values(null,null,20);

SQL> insert into test(id,name,age) values(null,null,20);

SQL> commit;

SQL> select * from test;

ID NAME              AGE

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

test1              10

test2              10

20

20

SQL> exec dbms_stats.gather_table_stats('scott','test',cascade=>true);

//注意:虽然我们建表时使用了"test"小写表名,但因为表名以大写存储,所以此时应该使用"TEST"

SQL> select index_name,index_type,num_rows,status,distinct_keys from user_indexes where table_name='TEST';

INDEX_NAME         INDEX_TYPE    NUM_ROWS   STATUS   DISTINCT_KEYS

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

TEST_ID_IND        NORMAL        0         VALID                0

TEST_ID_NAME_IND   NORMAL      

你可能感兴趣的:(oracle,空值,走索引吗)