ORACLE -> NULL & INDEXES

ljm0211發表於2012-06-20
SQL> create table nulltest(c1 varchar2(10),c2 varchar2(10), n1 number);
表已建立。
SQL> create unique index uidx_nulltest_01 on nulltest(c1,c2);
索引已建立。
SQL> insert into nulltest values('a','b',2);
已建立 1 行。
SQL> insert into nulltest values('a',null,3);
已建立 1 行。
SQL> insert into nulltest values(null,'b',4);
已建立 1 行。
SQL> insert into nulltest values(null,null,5);
已建立 1 行。
SQL> insert into nulltest values(null,null,6);
已建立 1 行。
SQL> insert into nulltest values(null,null,7);
已建立 1 行。
SQL> commit;
提交完成。
SQL> select c1,c2,count(*),sum(n1) from nulltest group by c1,c2;
C1         C2           COUNT(*)    SUM(N1)
---------- ---------- ---------- ----------
                                   3         18
              b                   1          4
a           b                    1          2
a                                 1          3
在考慮唯一性時,(NULL,NULL)與(NULL,NULL)並不相同。對於聚集來說,(NULL,NULL)與(NULL,NULL)則認為是相同的。
SQL> analyze index uidx_nulltest_01 validate structure;
索引已分析
SQL> select name,lf_rows from index_stats;
NAME                              LF_ROWS
------------------------------ ----------
UIDX_NULLTEST_01                        3
索引裡只有三個leaf,對於全部為NULL的key,索引並不儲存。所以對於 SELECT * FROM nulltest WHERE c1 IS NULL 或SELECT * FROM nulltest WHERE c1 IS NULL AND c2 IS NULL。
雖然c1,c2有建UNIQUE KEY,但是對於這種查詢,並不會用到索引。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-733377/,如需轉載,請註明出處,否則將追究法律責任。

相關文章