前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sql分页遍历出现重复数据原因与解决方案

sql分页遍历出现重复数据原因与解决方案

作者头像
用户3148308
发布2022-01-05 14:00:13
1.7K0
发布2022-01-05 14:00:13
举报
文章被收录于专栏:xiaoheikexiaoheike

1. 问题描述

有同时反馈,直接通过如下的sql进行分页查询,分页会出现重复数据,于是乎我专门查了相关了资料,整理了一下。

代码语言:javascript
复制
-- 根据sort字段对dbname进行排序,每五百条数据一页
SELECT * FROM  (  
	SELECT A.*, ROWNUM RN  FROM ( 
		select * from dbname
		where createtime between '20211212' and '20211213') A  
	WHERE ROWNUM <=7000 )  
WHERE RN >6500

2. 问题分析

可能的问题原因

2.1 Oracle 的 order by 是稳定排序么?

根据官方文档:ORDER BY clauses,里边有针对排序是否稳定做了说明。

EQL保证语句的结果在查询中是稳定的。这意味着:

  • 如果没有执行更新,则即使没有指定ORDER BY子句,或者ORDER BY句中指定的顺序有联系,同一语句也会在重复查询时以相同的顺序返回结果。
  • 如果执行了更新,那么只有明确影响订单的更改才会影响订单;订单不会受到其他影响。订单可能会受到更改的影响,例如删除或插入有助于返回页面上或之前结果的记录,或修改用于分组或订购的值。

例如,在没有ORDER BY子句的语句中,使用PAGE(0, 10)然后是PAGE(10, 10)然后是PAGE(20, 10)查询,在没有更新的情况下,从同一任意但稳定的结果返回连续的10条记录。

对于带有更新的示例,在带有ORDER BY Num PAGE(3, 4)的语句中,初始查询返回记录{5、6、7、8}。然后,更新插入带有4的记录(在指定页之前),删除带有6的记录(在指定页上),并插入带有9的记录(在指定页之后)。更新后,同一查询的结果将为{4、5、7、8}。这是因为:

  • 插入4将所有后续结果向下移动一个。抵消3条记录包括新记录。
  • 删除6个班次会将所有后续结果增加一个。
  • 插入9不影响此结果之前或包含的任何记录。

从官方文档的描述来看,只要加上order by,那么在没有影响到该查询条件的更新或者写入操作,则排序是不受影响的,是稳定的。官方文档的描述比较符合我的预期,因为我觉得要是我去实现,我就会使用稳定排序的算法去实现,而不是非稳定算法。

我看网络上充斥着这片文章:Oracle——分页查询出现重复数据问题的分析与解决,该文章提到一个观点需要唯一索引才能够保证分页排序不会重复。我觉得看法太浅了,相当于提出了解决方案,但是不知道为什么能够解决没有了解,另外就是文章感觉个人主观猜想太强了,理论没有依据来源的感觉,可信度就感觉比较低。根据官方文档的说明,实际只要加上排序即可保证分页遍历是不会出现重复数据的。

3. 解决方法

3.1 通过排序分页

我想这是最高效的写法,只要在createtime 字段加上索引,则查询和排序都会利用到该索引。

代码语言:javascript
复制
-- 根据sort字段对dbname进行排序,每五百条数据一页
SELECT * FROM  (  
	SELECT A.*, ROWNUM RN  FROM ( 
		select * from dbname
		where createtime between '20211212' and '20211213'
		order by createtime) A  
	WHERE ROWNUM <=7000 )  
WHERE RN >6500
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 问题描述
  • 2. 问题分析
    • 2.1 Oracle 的 order by 是稳定排序么?
    • 3. 解决方法
      • 3.1 通过排序分页
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档