做项目时发现一个问题,sql语句如下:
select t1.rowid rid,t2.rowid rid2,rownum rn,t1.*
from table_a t1 ,table_b t2 where ...
order by t2.a,t2.b,t2.c
表中有2条记录,其中a/b/c三个字段都是number,这2条记录中,这3个字段值都相同,a/b都是0,c都为null。
查询结果为2条结果,假设为A和B。
A的rd为AAAMv3AAFAAAAeFAAA, rd2为AAAMw0AAFAAAAmgAAA,rownum为2
B的rd为AAAMv3AAFAAAAeEAAC, rd2为AAAMw0AAFAAAAmcAAB,rownum为1
现象:1.执行上述sql的结果是 先A后B
2.去掉order by后的执行结果是 先B后A
3.执行 select * from (上述sql语句) 结果与1相同
4.执行 select * from (上述sql语句) where rownum<3 结果与2相同
分析:实际上oracle没有进行任何排序操作,rowid表示的是数据存放的数据块内部地址,如果没有要求排序,oracle会顺序的从数据块中读取符合条件的数据返回到客户端,不过看起来好像是按照rowid排序似的。
在Oracle中,orderby字段值都相等时,记录的顺序是随机的!当然了 其实这个顺序应该是SQL优化器优化执行的结果!
1.可以看作是sql优化器优化执行的结果
2.可以看作rid升序。
3.同1
4.同2