对于一般的情况 不使用order by 字句 而且 没有索引,那么,数据是直接按照ROWID排序输出的。事实上,不使用order by 子句,就意味着oracle根据取得数据的先后来输出数据,因此,如果内部机制的不同可能带来不同的输出顺序,不同的解释计划也可能导致输出顺序的不同,Index的影响当然也是有关系的,oracle用到了相关的索引那就会以这个索引来取数据,对于索引来说也是有顺序的。to:DD88(程序设计中...) ROWID不是一直顺序增加的,但是ORACLE在检索数据的时候一定是要有一个顺序去做的,这个顺序的依据就是ROWID,数据的物理存储位置。其他的数据库也是一样的,有可能不会暴露物理存储地址,但是检索的时候是一定会按照这个地址为检索的顺序依据的。 所以,十分认同不要期待SELECT出来的顺序是和数据插入顺序有关,当然是无关的,oracle自己会安排把数据放到哪里,所以,你永远也不知道检索出来的数据的顺序是什么。
to doulikeme(来去无踪) 兄: 那么这样说的话,如果要达到用select出来的顺序是按主键顺序排列的话,是不是就没有办法了? 另,能否稍深入点谈谈index对select排序的影响呢?对这个有些好奇。:) 谢谢!to nmgyjw兄: 加了你QQ,但是我白天上班无法上网,只能等晚上下班后才能上网了。:)
to DD88(程序设计中...) : 在没有指定 order by 子句的话, ORACLE返回数据的顺序是根据取得数据的先后顺序的,因为任何的排序都是需要代价的,所以如果不指定order by,oracle是不会做任何顺序上的处理的。 至于index的影响就是影响oracle获取数据的方式,如果oracle按照某个索引的顺序去去数据的话,那就是所谓的按照索引排序,但这个也并不是必定的,直接取决于oracle内部怎么处理,所以,如果要排序,指定order by。
to 来兄 谢谢你的解释。比较理解了。感谢感谢!:)to 袁兄 我们单位管得严啊,连带红外线的手机都不能带近公司,上网就更不可能了。所以只能回家才上网了。有事我给你留言。:)
我想也可能是跟ROWID有关,那么ROWID是顺序增加的话,SELECT出来的数据也应该是顺序的吧。
我记得曾经在那本书上看到过,讲永远都不要期待SELECT出来的顺序是和数据插入顺序有关……
当然,oracle有记录唯一标识符Rowid,但是其他DBMS呢?比如SQL Server, sybase呢?不知道是按什么排的,也许也有一定的内部机制。单位有oracle,可惜上班没来得及验证我的想法(关于RowID),现在在家,手头上又没有oracle可以试。
ROWID不是一直顺序增加的,但是ORACLE在检索数据的时候一定是要有一个顺序去做的,这个顺序的依据就是ROWID,数据的物理存储位置。其他的数据库也是一样的,有可能不会暴露物理存储地址,但是检索的时候是一定会按照这个地址为检索的顺序依据的。 所以,十分认同不要期待SELECT出来的顺序是和数据插入顺序有关,当然是无关的,oracle自己会安排把数据放到哪里,所以,你永远也不知道检索出来的数据的顺序是什么。
那么这样说的话,如果要达到用select出来的顺序是按主键顺序排列的话,是不是就没有办法了? 另,能否稍深入点谈谈index对select排序的影响呢?对这个有些好奇。:) 谢谢!to nmgyjw兄:
加了你QQ,但是我白天上班无法上网,只能等晚上下班后才能上网了。:)
在没有指定 order by 子句的话, ORACLE返回数据的顺序是根据取得数据的先后顺序的,因为任何的排序都是需要代价的,所以如果不指定order by,oracle是不会做任何顺序上的处理的。
至于index的影响就是影响oracle获取数据的方式,如果oracle按照某个索引的顺序去去数据的话,那就是所谓的按照索引排序,但这个也并不是必定的,直接取决于oracle内部怎么处理,所以,如果要排序,指定order by。
谢谢你的解释。比较理解了。感谢感谢!:)to 袁兄
我们单位管得严啊,连带红外线的手机都不能带近公司,上网就更不可能了。所以只能回家才上网了。有事我给你留言。:)