索引的排序问题
-----------------2013/10/09
Oracle Concept:3-7 Indexes and Index-Organized Tables
Full Index Scan: A full scan can eliminate sorting because the data is ordered by index key.
引发思考,是否索引是保持有序的?
网友解释:
在一个非惟一索引中,Oracle会把rowid作为一个额外的列(有一个长度字节)追加到键上,使得键惟一。例如,如果有一个CREATE INDEX I ON T(X,Y)索引,从概念上讲,它就是CREATE UNIQUE INDEX I ON T(X,Y,ROWID)。在一个惟一索引中,根据你定义的惟一性,Oracle不会再向索引键增加rowid。在非惟一索引中,你会发现,数据会首先按索引键值排序(依索引键的顺序)。然后按rowid升序排序。而在惟一索引中,数据只按索引键排序。
你的实验里可以增加些同样键值的条目(在ASSM管理下,以不同的SESSION插入,一般就会插入到不同的块里)然后DUMP出索引叶,会发现键值同样的情况下,ROWID会按照从小到大排序。
这个解释与上面官方文档中提到的是一致的,索引是有序的。这样会引起页块分裂。
这里要区分DB2中提到的聚集索引,DB2中聚集索引索引本身也是有序的,只是如果不是聚集索引,索引所对应的数据是分散的,聚集索引的优点是能保持数据的聚集,达到加速访问的目的。
注意:随着时间的推移,当表中的可用空间被填满时,具有聚集索引的表可能变成非聚集的,然而一个MDC表可以自动连续的在指定的维度上维护它的聚集,而不必通过重组表来恢复数据的物理顺序。
测试验证。
表:orindex (i int) 索引:or_index on orindex(i)
select /*+index(orindex or_index)*/ * from orindex where i<99999 order by i;
执行计划:
----------------------------------------------------
0 SELECT STATEMENT
1 INDEX RANGE SCAN | OR_INDEX
----------------------------------------------------
统计信息:
0 sorts (memory)
0 sorts (disk)
结论:通过索引访问,对key值排序,oracle没有发生排序。