加载中…
个人资料
郭鹏飞-山西
郭鹏飞-山西
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,353
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

针对Oracle分页数据重复问题

(2017-06-20 20:08:50)
标签:

oracle分页数据重复

杂谈

分类: Oracle数据库
Oracle分页重复问题
1.问题出现背景:
在实际业务模块中,主要负责查询统计功能,在数据量巨大的情况下,需要使用到分页的技术,使用的oracle数据库,后台框架使用的分页为
select * from (select row_.*, rownum rownum_ from (SELECT * FROM T_SB_ZNYC_DZ T) row_ where rownum <= ?) where rownum_ > ?
在实际应用中偶尔会出现数据重复问题.

2.原因分析:
这里的ROWNUM是一个伪列,它是oracle为查询结果所编的一个号,第一行的ROWNUM为1,第二行为2,以此类推。 
因为oracle是按块进行读取数据的,如果数据按顺序存储,则可能使读取出来的数据是按顺序的,给用户误解为默认排序。
事实上,oracle没有进行任何排序操作,如果sql没有要求排序,oracle会顺序的从数据块中读取符合条件的数据返回到客户端。所以在没有使用排序sql的时候,分页返回的数据可能是按顺序的,也可能是杂乱无章的,这都取决与数据的存储位置。在分页查询过程中,如果数据的物理位置发生了改变,就可能会引起分页数据重复的现象。 所以,要正确使用分页查询,sql语句中必须有排序条件。
3.解决方法:
1). sql语句中需要有排序条件 且排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键。我在开发中是用的是 order by rowid(我使用order by obj_id(主键) 测试了下还有重复)
2).可以使用Oracle排序中的between...and...进行分页(同事给的解决方法 我没有实际应用).

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有