oracle ORDER BY 字段值相同时 结果随机

在使用ORDER BY根据某个字段进行排序时,当有好几条数据这个字段值相同时,oracle会如何处理呢?
答案是,随机处理。

 SELECT
        * FROM (SELECT tt.*, ROWNUM AS rowno
        FROM ( SELECT t.*
        FROM AIMS_LIST_INFO t
        WHERE  1=1
        ORDER BY t.date_updated DESC ) tt
        WHERE ROWNUM <=  #{end}) table_alias
        WHERE table_alias.rowno >  #{begin}

这是使用sql实现分页的代码,当数据为批量导入时,date_updated这个字段的值都是一样的,这时我们会发现,第一页即begin=0&end=5和第二页即begin=5&end=10时会出现重复数据。

注:如果直接运行上述sql,赋值begin=0&end=100,执行若干次,会发现每次排序结果都一致,然而,这就能证明随机性是错误的嘛?

赋值begin=0&end=100
赋值begin=0&end=50
注意观察0-50条数据,是一致的嘛?

不是!!!
因此,前一种现象显然是数据库自身缓存的缘故,相同的sql执行结果会直接取缓存,而不是直接执行。

解决方式:在ORDER BY t.date_updated DESC中增加一个查询条件,打破这种排序字段完全一致导致的随机排序结果即可。 我增加的是表的主键,由oracle默认生成的

RAWTOHEX(SYS_GUID())

这是一个随机生成的具有唯一性的字段,这样应该可以避免排序字段完全一致造成的问题。

猜你喜欢

转载自blog.csdn.net/yjw1007020425/article/details/80162094