索引的排序问题

索引的排序问题
-----------------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没有发生排序。

转载于:https://www.cnblogs.com/jackhub/p/3360377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值