有如下表
Person
id             name
--------------------
1              'aa'
2              'bb'
.....
现在id列上分别建立聚簇索引和非聚簇索引,然后用
select * from Person where id < 1000000;
语句来检索,此时两种索引查询效率的差异是由什么造成的?
如果说是I/O原因,聚簇索引判断条件时也会进行I/O操作。
非聚簇索引ID列也有序,同样可以进行索引范围扫描吧。请详细说明,包括索引的组织结构等,谢谢

解决方案 »

  1.   

    仔细看一下:
    http://www.oracle.com/technology/global/cn/pub/articles/sharma_indexes.html 
      

  2.   

    聚簇索引是SQL SERVER 的概念,Oracle没有聚簇索引的概念,和其类似的是IOT(索引组织表).
    如果你说的是Cluster Index的话,那是针对多表的,对于单表查询来说没有任何意义.
      

  3.   

    只说在SQLServer下
    据我的理解,聚簇索引是物理有序,可以快速检索出某个范围的数据,但非聚簇索引同样有序,同样作为WHERE条件
    列时,非聚索引通过索引值和数据页指针同样快速定位记录范围,就多了通过指针访问数据这一个步骤,两种索引数引对数据I/O是一样的,效率上相差不会很大才对
    很多资料上说效率差异比较大,这到底是什么原因产生的。
      

  4.   

    系统在处理两张索引上没有什么差异,主要的性能差异在于读取索引对应的原始数据上。
    简单的说,聚簇索引中键值的顺序和表数据本身的顺序是一致的。这样当在聚簇索引中移动的时候,当它要寻找对应的表数据的时候,发现对应的表数据通常是在一个页面上或者在相邻的页面上,这样处理表数据效率就很高。
    而非聚簇索引中键值的顺序和表数据本身的顺序是不一致的。在非聚簇索引中移动的时候,当它要寻找对应的表数据的时候,发现在对应的表数据是不连续的,随机的。这样可能每查找一个数据就需要找到不同的数据页面,这样处理表数据效率就比较低。
    上面是SQL Server的用法,Oracle的用法不太相同。
    SQL Server上每个表都可以有个聚簇索引,Oracle如果要有类似的聚簇索引只有索引组织表(IOT)了。
    Oracle中的普通表中数据的顺序和索引的顺序无关。不过在统计数据中有一项聚簇因子可以来了解数据和索引顺序的相似程度。