oracle排序翻页后数据丢失

原创 2012年03月27日 16:54:15

今天又发生数据丢失的问题了,按查出来的总条数看是对的,但是具体数据时,会发现少了部分。这个问题以前也发生过,当默认查询没有用到排序时,翻页就会出现这种情况。

网上搜了下,说是oracle的问题,把它的文章转载过来留个档

 

“一般我们用Oracle的表都是堆表(Oracle存储表的一种方式),对于堆表,必须知道他的机制:

     全部扫描时,会按命中的顺序来获取数据,而不是以插入的顺序。这是一个必须了解的重要的数据库表概念:一般来讲,数据库表本质上是无序的数据集合。还应该 注意到,要观察到这种效果,不必在INSERT后接下来再使用DELETE;只需使用INSERT就可以得到同样的结果。如果我插入一个小行,那么观察到 的结果很可能是:取出行时默认的顺序为“小行、小行、大行”。这些行并不按插入的顺序获取。 Oracle会把数据放在能放下的任何地方,而不是按照日期或事务的某种顺序来存放。

 如果你的查询需要按插入的顺序来获取数据,就必须向表中增加一列,以便获取数据时使用这个列对数据排序。例如,这可以是一个数字列,有一个递增的序列(使 用Oracle SEQUENCE对象)。只需使用一个SELECT,其ORDER BY子句对这个列完成排序,这样就可以模拟插入顺序。这个顺序可能只是近似的,因为序号为55的行很可能在序号为54的行之前提交,因此,数据库中序号为 55的行可能放在前面。

 应该把堆组织表看作一个很大的无序行集合。这些行会以一种看来随机的顺序取出,而且取出的顺序还取决于所用的其他选项(并行查询、不同的优化器模式,等 待),同一个查询可能会以不同的顺序取出数据。不要过分依赖查询得到的顺序,除非查询中有一个ORDER BY语句!除非你的查询中有一个 ORDER BY,否则不要指望返回的数据会按某种顺序排序。 (另外,GROUP BY 也不会执行排序!ORDER BY 是无可替代的) 。”

我们这次出问题的应用虽然用了排序,但是由于使用的排序字段是个日期值,而数据表里存在大量的重复日期数据,导致Oracle的排序出现问题,所以一般按照某些字段排序后,我们需要再加一个order by id。

 

最后终结以下出现此问题的前提:

1、SQL分页

2、用了Oracle的堆表(如果你建表时候没有指定表类型,默认就是堆表)

3、按照且仅按照一个有大量重复数据的字段排序(或者压根就没排序)

 

SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例

对于关系数据库来说,直接写SQL拉数据在列表中显示是很常用的做法。但如此便带来一个问题:当数据量大到一定程度时,系统内存迟早会耗光。另外,网络传输也是问题。如果有1000万条数据,用户想看最后一条,这...
  • fengbonianshao
  • fengbonianshao
  • 2014年04月03日 11:02
  • 2159

oracle分页查询并按照某字段进行排序的数种解决方案

方案一(对于大数据集, 会明显的影响查询效率):SELECT * FROM(     SELECT ROWNUM RN,TA.*     FROM(        select t.id ID, o....
  • hemingwang0902
  • hemingwang0902
  • 2009年09月23日 10:48
  • 1886

排序分页结果错乱的问题

如果order by有内容,但是不能确定唯一的位置,则sql每次查询的结果可能不一样, 如果进行分页的话,就会导致数据错乱。 分页必须保证order by 确定每行的位置,如果不能确定,可...
  • xiuzhentianting
  • xiuzhentianting
  • 2015年09月14日 18:32
  • 345

Hibernate 先排序再分页问题

DB2为例hibernate分页排序sql ORDER BY t.STATIS_DATE desc, T.AREA_CODE,T.SUBS_AREA_CODE,T.BLOCK_CODE,T.COMTY...
  • u011846594
  • u011846594
  • 2013年11月19日 10:14
  • 741

oracle之去重与排序

oracle的distinct,order by实战
  • yhl_jxy
  • yhl_jxy
  • 2016年02月18日 20:23
  • 1417

Oracle中使用了Union后的排序问题

最近使用SQL语句进行UNION查询,惊奇的发现:SQL没问题,UNION查询也没问题,都可以得到想要的结果,可是在对结果进行排序的时候,却出问题了。 1.UNION查询没问题 ...
  • w405722907
  • w405722907
  • 2017年08月16日 17:29
  • 463

Oracle-分析函数之排序后顺序号row_number()

概述ORACLE函数系列:Oracle常见函数大全Oracle-分析函数之连续求和sum(…) over(…)Oracle-分析函数之排序值rank()和dense_rank()Oracle-分析函数...
  • yangshangwei
  • yangshangwei
  • 2016年11月04日 20:51
  • 5461

解决分页翻页多选框选中的数据丢失问题

问题: 分页翻页的时候上一页选中的多选框消失,想要的结果:选中下一页多选框再返回上一页的时候多选框不消失 解决思路: 解决分页翻页多选框选中的数据丢失问题的中心思想就是,找个地方存选中的多选框的...
  • liuqiangrxt
  • liuqiangrxt
  • 2017年04月11日 11:47
  • 781

Oracle中的order by分页排序问题

今天在系统测试的过程中,测试人员发现自己新添加的科目添加到系统中在页面默认分页查询中没有找到自己新加的科目(分页过程中页面显示数据确实和数据表中的数据总量一致),但是通过系统的搜索功能是可以查询的到数...
  • nooneyanghuijava
  • nooneyanghuijava
  • 2016年08月11日 16:27
  • 1283

oracle排序后获取第一条数据

首先想说下,其实很简单的 select * from (select * from testStudent order by id desc) where rownum=1; ...
  • u010227447
  • u010227447
  • 2014年05月18日 09:53
  • 16126
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle排序翻页后数据丢失
举报原因:
原因补充:

(最多只允许输入30个字)