聚集索引相关例子

请问以下语句如何优化:

CREATE TABLE aa_001
   (         ip VARCHAR2(28),
        name VARCHAR2(10),
        password VARCHAR2(30)           )

select * from aa_001 where ip in (1,2,3) order by name desc;
--目前表中记录有一千多万条左右

 

 

分析问题

        1,数据量1千万多条。

        2in中的值个数是不确定

     3.1 分析数据分布

      这里作者没有提到ip列的数据的分布情况,目前ip列的数据分布可能有以下几种:

         1ip列(数据唯一,或者数据重复的概率很小)

         2ip (数据不均匀,可能有些数据重复多,有些重复少)

         3ip (数据分布比较均匀,数据大量重复,主要就是一些同样的数据(可能只有上万级别不同的ip数据等)

 

     解决问题:

         1,对于第一种数据分布情况,只要在ip列建立一个索引即可。这时不管表有多少行, in个数是不确定的情况下,都很快。

         2,对应第二中数据分布情况,在ip列建立索引,效果不好。因为数据分布不均匀,可能有些快,有些慢

         3,对应第三种数据分布情况,在ip列建立索引,速度肯定慢。

        注意:这里的 order by name desc 是在取出数据后再排序的。而不是取数据前排序

 

     对于23两个情况,因为都是可能需要取出大量的数据,优化器就采用表扫描(table scan),而不是索引查找(index seek) ,速度很慢,因为这时表扫描效率要优于索引查找,特别是高并发情况下,效率很低。

 

    那对应23中情况,如何处理。是将in改成exists。其实在sql server 2005oracle里的优化器在in后面数据少时,效率是一样的。这时采用一般的索引效率很低。这时如果在ip列上建立聚集索引,效率会比较高。

 

 

   从上面的测试例子可以看出, 优化的解决办法:

     数据分布为1:建立ip索引即可

     数据分布为2,3:在ip列建立聚集索引。

 

 

 

你可能感兴趣的:(持久层)