索引的排序问题

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

posted @   胡.杰  阅读(1126)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示