`
lelong
  • 浏览: 554970 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle分页查询数据重复问题

 
阅读更多

在oracle分页查询中,我们采用类似以下所示的公认的比较高效的数据库分页查询语句(Effective Oracle by Design中有描述、众多oracle使用者也做过测试)。
写道  SELECT * FROM (  SELECT A.*, ROWNUM RN  FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= n) WHERE RN > m  这里的ROWNUM是一个伪列,

它是oracle为查询结果所编的一个号,第一行的ROWNUM为1,第二行为2,以此类推。 因为oracle是按块进行读取数据的,
如果数据按顺序存储,则可能使读取出来的数据是按顺序的,给用户误解为默认排序。

事实上,oracle没有进行任何排序操作,如果sql没有要求排序,oracle会顺序的从数据块中读取符合条件的数据返回到客户端。
所以在没有使用排序sql的时候,分页返回的数据可能是按顺序的,也可能是杂乱无章的,这都取决与数据的存储位置。
在分页查询过程中,如果数据的物理位置发生了改变,就可能会引起分页数据重复的现象。 所以,要正确使用分页查询,sql语句中必须有排序条件。

但是,在有排序条件的时候,仍然会出现数据重复的现象,这是为什么呢?
通过了解oracle的排序机理就会明白,出现这种情况的原因是因为排序列值的不唯一性。 Oracle这里使用的排序算法不具有稳定性,
也就是说,对于键值相等的数据,这种算法完成排序后,不保证这些键值相等的数据保持排序前的顺序。

解决的方法是在后边增加一个唯一性列,比如主键。
所以解决方法如下(两个条件必须同时满足):
 1.sql语句中需要有排序条件。
 2.排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键。

分享到:
评论
2 楼 yu_meiguang 2016-06-16  
真心感谢啊,找了半天才知道是这个以时间戳问题导致的问题
1 楼 字母哥 2014-06-10  
不错 今天用到了 时间戳排序的话有一样的就排序数据乱了

相关推荐

    spring+ibatis+oracle分页缓存源码

    总的来说,"spring+ibatis+oracle分页缓存源码"项目展示了如何在Spring管理的环境中,利用iBatis和Oracle数据库实现高效的数据分页和缓存策略。通过理解和实践这些技术,开发者可以构建出更加健壮、响应快速的Web...

    Oracle数据库中分页查询介绍

    在Oracle数据库中,分页查询是一项关键功能,尤其在构建高效的数据检索系统,如自定义搜索引擎时,确保用户能够分批浏览大量数据。由于Web应用的无状态特性,每个请求都是独立的,维持数据库游标以供后续请求是低效...

    oracle分页案例

    Oracle数据库在处理大数据量时,分页查询是一种非常常见的优化策略。它允许用户按需加载数据,而不是一次性加载所有记录,从而提高了应用性能并减轻了服务器负担。本案例将详细介绍Oracle数据库中的分页查询实现方法...

    oracle 采用三层结构分页后有的页数据重复问题

    在处理分页查询时,可能会遇到数据重复的问题,这通常是由于不正确的查询语句或者分页逻辑导致的。让我们深入探讨这个问题以及如何解决。 首先,我们要理解分页查询的基本概念。在数据库中,分页通常通过SQL的`...

    通用ORACLE存储过程实现分页和查询

    在大数据量的数据库应用中,分页查询是必不可少的,因为它能够有效地处理和展示结果,避免一次性加载大量数据导致性能下降。本篇将详细介绍如何在Oracle中使用存储过程实现分页查询。 首先,我们需要了解分页的基本...

    Oracle分页查询性能优化代码详解

    本文将深入探讨Oracle分页查询的性能优化,并提供相关的代码示例。 首先,我们来看两种常见的分页查询方法: 1. **子查询与行号(ROWNUM)结合**: ```sql SELECT * FROM ( SELECT rownum RN, t.* FROM table t...

    如何在Oracle中实现搜索分页查询

    在Oracle数据库中,实现搜索分页查询是一项常见的任务,特别是在构建高效的数据检索系统时。分页查询允许用户逐步浏览大量数据,而无需一次性加载所有结果,从而提高用户体验并减轻服务器负担。以下是如何在Oracle中...

    MyFaces Oracle大数据表分页封装.docx

    这个类是用于存储和管理分页数据的核心,它包含了三个主要属性:`datasetSize`(数据集总大小),`startRow`(当前页起始行索引),以及`data`(当前页的数据列表)。通过这三个属性,我们可以知道数据集的完整规模、当前...

    oracle rownum 学习

    Oracle ROWNUM学习 Oracle ROWNUM是Oracle系统顺序分配的行号,用于限制查询返回的总行数。ROWNUM是一个伪字段,不能以任何表的名称作为前缀。...但是,需要注意ROWNUM的限制和使用子查询来解决一些查询问题。

    oracle存储过程通用分页

    Oracle存储过程是数据库管理系统Oracle中实现复杂业务逻辑的重要工具,它可以封装一系列SQL语句和PL/SQL代码,形成可重复使用的程序单元。在处理大量数据时,为了提高性能和用户体验,通常会采用分页查询的方式来...

    oracle的伪列与分页

    综上所述,Oracle伪列如ROWID和ROWNUM在实际应用中发挥着重要作用,不仅可以帮助优化查询性能,还能轻松实现复杂的分页功能。同时,通过Java JDBC编程,可以进一步提升应用程序与Oracle数据库的集成度和灵活性。

    springboot+mybatisplus(mybatis)+mysql+oracle 多数据源项目

    这是一个典型的企业级应用场景,能够帮助开发者更好地理解和处理多数据库环境下的数据交互问题。 首先,Spring Boot是Spring框架的简化版,它提供了一种快速开发微服务的方式。通过自动配置和“起步依赖”(Starter...

    Oracle中使用伪列rownum实现分页查询

    在Oracle数据库中,分页查询是一项常见的操作,用于在大量数据中检索特定范围的记录,以提高用户体验并减少网络传输的数据量。Oracle提供了一种特殊类型的列,称为伪列(Pseudo-Column),其中一个最著名的例子就是`...

    JSP+JDBC_真分页(基于Oracle数据库分页)笔记

    这需要在数据库层面编写特定的SQL查询,利用Oracle的ROWNUM或者ROWNUMBER()函数来限制返回的记录数,从而实现高效的数据分页。例如,以下是一个简单的示例: ```sql SELECT * FROM (SELECT ROW_NUMBER() OVER ...

    SQL分页读取海量数据存储过程

    2. 分页查询可能导致数据不一致,如果在用户翻页期间有数据更新,可能会出现某些记录无法显示或重复显示的情况。 3. 当数据变化频繁时,计算总页数可能需要额外的计算成本,可以考虑提供一个估算值或动态计算。 综...

    oracle 增加,删除,修改和分页存储过程

    分页查询在大数据量的场景下非常重要,以避免一次性加载过多数据导致性能问题。一个分页存储过程,如`GET_EMPLOYEES_BY_PAGE`,会接受页码和每页大小作为参数,返回指定范围的记录。它通常会结合使用`ROWNUM`伪列...

    php实现数据分页的通用方法类.zip

    数据分页是将数据库查询结果按一定的数量(如每页10条)进行分割,然后根据用户请求的页码返回对应部分的数据。这不仅优化了用户体验,也减轻了服务器的压力。 在提供的通用方法类中,可能会包含以下几个核心功能:...

    Nhibernate分页

    对于分页查询,合理使用缓存策略能够减少重复查询。 2. **预加载关联对象** 如果查询中涉及关联对象,可以使用`Fetch()`或`Join()`方法预加载,避免懒加载导致的多次数据库访问。 3. **索引优化** 对于分页查询...

    spring springmvc mybatis easyui分页

    6. **分页原理**:理解分页的基本原理,包括查询参数、数据截取、页码计算等。 7. **前后端交互**:学习如何在SpringMVC中处理Ajax请求,实现前后端的数据通信,以实现EasyUI的动态分页。 8. **项目结构**:了解一...

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    在描述中提到的问题中,当使用`ORDER BY`对包含非唯一值的列进行排序,并结合分页查询时,发现不同页码的数据可能会有重复。这进一步证实了`ORDER BY`在Oracle中的不稳定特性。在没有唯一索引或主键约束的情况下,...

Global site tag (gtag.js) - Google Analytics