使用索引的误区之四:空值对索引的影响

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
使用 索引误区之四:空值对 索引影响
我们首先做一些测试数据:

SQL>createtablet(xint,yint);

 

Tablecreated

 

请注意,这里我对表t做了一个唯一(联合) 索引

SQL>createuniqueindext_idxont(x,y);

 

Indexcreated

 

SQL>insertintotvalues(1,1);

 

1rowinserted

 

SQL>insertintotvalues(1,NULL);

 

1rowinserted

 

SQL>insertintotvalues(NULL,1);

 

1rowinserted

 

SQL>insertintotvalues(NULL,NULL);

 

1rowinserted

 

SQL>commit;

 

Commitcomplete

 

下面我们分析一下 索引

SQL>analyzeindext_idxvalidatestructure;

 

Indexanalyzed

 

SQL>selectname,lf_rowsfromindex_stats;

 

NAME                             LF_ROWS

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

T_IDX                                  3

 

SQL>

然后,我们就可以看到,当前的 索引中仅仅保存了3行数据。

请注意,上面我们插入并提交了四行数据。

所以,这里就有一个结论:

索引不保存全部为空的行。

 

 

我们继续插入数据,现在再插入几行全部为空的行:

SQL>insertintotvalues(NULL,NULL);

 

1rowinserted

 

SQL>insertintotvalues(NULL,NULL);

 

1rowinserted

我们看到这样的插入,居然没有违反前面我们设定的唯一约束(uniqueont(x,y)),

所以,这里我们又得出一个结论:

Oracle认为NULL<>NULL,进而(NULL,NULL)<>(NULL,NULL)

换句话说,Oracle认为空值(NULL)不等于任何值,包括空值也不等于空值。

 

我们看到下面的插入会违反唯一约束(DEMO.T_IDX),这个很好理解了,因为它不是全部为空的值,即它不是(NULL,NULL),只有全部为空的行才被认为是不同的行:

SQL>insertintotvalues(1,null);

 

insertintotvalues(1,null)

 

ORA-00001:违反唯一约束条件(DEMO.T_IDX)

 

SQL>insertintotvalues(null,1);

 

insertintotvalues(null,1)

 

ORA-00001:违反唯一约束条件(DEMO.T_IDX)

 

SQL>

 

请看下面的例子:

SQL>selectx,y,count(*)fromtgroupbyx,y;

 

   X       Y  COUNT(*)

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

                       3

            1         1

   1                  1

   1       1         1

Executedin0.03seconds

 

SQL>selectx,y,count(*)fromtwherexisnullandyisnullgroupbyx,y;

 

  X      Y  COUNT(*)

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

                     3共4页  第1页   
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值