Thursday, April 30, 2009

一个巧妙的Index

在一个论坛上看到一个我认为很精妙的创建Index的方法,后面的讨论更加精彩,于是把这个贴子里的精髓部分整理一下。
下面是一个创建索引的语句:
create index idx_prodd on prodd (status,'1');

创建这个索引的意义是什么呢?原来这是DBA为了让status为null时,Where子句中包括status时,SQL语句也能利用索引进行快速查找。
Oracle中创建B-tree索引时,这个column上为null值时是不会被索引,这时候以这个字段is null为条件查询时必须进行table full scan。
现在用这个语句创建一个联合索引,保证status为null时,这个值仍然会被索引,因此保证能够通过索引去查询。而另外一个方面另外一辅助常量字段1,对于索引的大小影响也不大,确实是一个很聪明的做法。
这样看来,在对表的字段进行设计时对于会出现在查询条件中的值应该尽量避免null值。如果某些字段可以为null的值,给它设定一个default值, 如‘NULL’,这样能有效保证查询的数据。
下面这个例子,可以考虑采用下面的方法达到相同效果:
alter table prodd modify status not null ;
alter table prodd modify status default ‘NULL‘;
然后将SQL的 where status is null 改成 where status = ’NULL‘。
虽然这样做会增加一点数据存储的空间,但是获得的好处远远大于这些存储开销。

No comments:

Post a Comment