oracle 分页之后关联字段,记一次oracle分页查询部分数据分页后相同的情况(生产环境问题)...

记一次oracle分页查询部分数据分页后相同的情况(生产环境问题)

记一次oracle分页查询,部分数据分页后相同的情况(生产环境问题)

(因为是内网开发,数据不好拿出来,所以拍照给各位看官)

首先阐述一下现象:

oracle分页查询,一共1069条数据,每页十条,从第二页开始一直到第二十四页的数据全都是一样的,从第二十五页数据不一样

1c5aac65359dc13aa5d5ce773896b7c5.png

55d27b0a165edef2bb1b0bc3c2596f56.png

d21059ba27a31fbce35f438ede534a7f.png

以上是第六页,第七页,第十二页的数据,数据一模一样,首先拿到这个问题,我想应该是没去重吧,我把sql拿了出来,(见下面图片),用的是union,那应该去重了,但是还是不放心,于是又加了distinct对查询结果进行全量去重,还是1069条,看来不是去重的问题,后来我怀疑是不是数据问题,于是又把重复的数据拿出来单个查询,结果都只是一条,再次我想是不是分页出了问题,于是在控制台打印sql,看现象,最后全都排除了,

c5df0271dc361c995f8da95c9e7da2c2.png

因为隐私问题,就不给各位看官截图了,我直接给各位看官阐述一下我在plsql中分页查询的结果:我查询了第211~220 第221~230 第121~130,抽取部分数据查询,发现了问题和页面显示的结果一样,都是重复的数据,那么问题基本定位在后端sql了,后来我看他的排序字段modifydate和batchno字段,这两个字段排序都是有重复数据的,我想会不会是这个问题,于是我给他加了一个唯一性字段(serialno)来排序,结果好了。

问题说明:排序字段有重复数据,导致查询出重复数据

问题详解:oracle是按照块读取数据的,如果数据按照顺序存储,则可能使读取出来的数据是按照顺序的,给用户误解为默认排序,事实上,oracle没有进行任何的排序操作,如果sql没有要求排序,oracle会顺序的从数据块中读取符合条件的数据返回到客户端,所以在没有使用排序sql的时候,分页返回的数据可能是按顺序的,也可能是杂乱无章的,这都取决于数据的存储位置,在oracle分页查询过程中,如果数据的物理位置发生了变化,就可能会一起分页数据重复的现象。

对于不同oracle版本,处理这种情况的机制是不一样的,在9中会根据rowid来排序,但是10.2中还引入了一种类似堆排序的方法处理这种情况,之所以order by后加索引能解决,是因为即使有重复值,也可以根据索引进行区分。

但是在有排序条件的时候仍然会出现数据重复的现象,这是为什么呢?

通过了解oracle的排序机理就会明白,出现这种情况的原因是因为排序列值的不唯一性,oracle这里使用的排序算法不具有稳定性,也就是说,对于键值相等的数据,这种算法完成排序之后,不保证这些键值相等的数据保持排序前的顺序。

所以最终解决方式如下:

sql语句中需要有排序条件,并且排序条件如果没有唯一性,那么必须在后面跟上唯一性的条件,比如主键

记一次oracle分页查询部分数据分页后相同的情况(生产环境问题)相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值