最近在帮一个同事调试BUG,有一个条BUG是这样描述的:
所有有排序功能的列表,当其中某一字段当前页面内容一致时,翻页就有误。
页码改变,列表内容不变。
看到这个BUG第一反应是查看翻页的SQL语句。调试后找到SQL语句为:
SELECT * FROM
(
SELECT BIZ.*,ROWNUM RN FROM
(SELECT * FROM WIKI_BIZ B WHERE B.BIZ_SYNC_TYPE < 3 ORDER BY B.BIZ_VIEW_COUNT ASC) BIZ
WHERE ROWNUM <= 20
)WHERE RN >=11;
SELECT * FROM
(
SELECT BIZ.*,ROWNUM RN FROM
(SELECT * FROM WIKI_BIZ B WHERE B.BIZ_SYNC_TYPE < 3 ORDER BY B.BIZ_VIEW_COUNT ASC) BIZ
WHERE ROWNUM <= 30
)WHERE RN >=21;
查询后的结果为:
<
BIZ_ID |
BIZ_SYNC_CODE |
BIZ_SYNC_NAME |
BIZ_SYNC_TYPE |
BIZ_SYNC_TIME |
BIZ_SYNC_FROM |
BIZ_VIEW_COUNT |
32278 |
BP4192 |
手机悦读会会员包 |
2 |
2012-1-5
3:04 |
1 |
0 |
32277 |
SP004385 |
中国移动;北方手机报 |
2 |
2012-1-5
3:04 |
1 |
0 |
32276 |
MP0362 |
彩铃音乐盒《三分贝兑换铃音包(1区)》 |
2 |
2012-1-5
3:04 |
1 |
0 |
32275 |
CP13D6 |
动感地带网聊套餐(139邮箱,彩铃,飞信,彩信账单) |
2 |
2012-1-5
3:04 |
1 |
0 |
32274 |
SP000481 |
中国移动;泰州手机报 |
2 |
2012-1-5
3:04 |
1 |
0 |
32268 |
SP005722 |
移动梦网自有游戏;丰尚佳诚5元包月游戏套餐 |
2 |
2012-1-5
3:04 |
1 |
0 |
32267 |
SP008506 |
中国移动;手机报-M-zone英语(大学版)(0元版) |
2 |
2012-1-5
3:04 |
1 |
0 |
32261 |
BP1142 |
12580彩信-掌上折扣 |
2 |
2012-1-5
3:04 |
1 |
0 |
32258 |
CP00P1 |
新全球通 |
2 |
2011-12-15
3:04 |
1 |
0 |
32251 |
BP1701 |
索乐测试包 |
2 |
2011-12-15
3:04 |
1 |
0 |
两条SQL语句的查询结果一模一样
!
当时我也不知道为什么结果为一模一样,但是注意到BIZ_VIEW_COUNT的值都是0。就猜想是排序列不唯一造成的排序不稳定造成的。
后来去网上查找有没有类似的问题。发现也有很多人遇到这个问题,并且进行过讨论。解决的方法很简单,就是
把排序的内容弄成唯一的
。我试了排序的时候加上ROWID,或者WIKI_BIZ的主键BIZ_ID,问题得到解决。
解决方法:把排序的内容弄成唯一的!
SQL语句如下:
SELECT * FROM
(
SELECT BIZ.*,ROWNUM RN FROM
(SELECT * FROM WIKI_BIZ B WHERE B.BIZ_SYNC_TYPE < 3 ORDER BY B.BIZ_VIEW_COUNT ASC,ROWID/***或者B.BIZ_ID***/) BIZ
WHERE ROWNUM <= 20
)WHERE RN >=11;
后来又看到有人讨论ORACLE是怎么进行排序的,导致结果一模一样。根据讨论者的思路写了几个SQL,发现排序也是很有规律的。SQL语句如下:
SELECT RID, ROWNUM FROM
(SELECT ROWID RID FROM WIKI_BIZ B ORDER BY B.BIZ_VIEW_COUNT)
WHERE ROWNUM <= 30;
SELECT RID, ROWNUM FROM
(SELECT ROWID RID FROM WIKI_BIZ B ORDER BY B.BIZ_VIEW_COUNT)
WHERE ROWNUM <= 40;
SELECT RID, ROWNUM FROM
(SELECT ROWID RID FROM WIKI_BIZ B ORDER BY B.BIZ_VIEW_COUNT)
WHERE ROWNUM <= 50;
分别按照BIZ_VIEW_COUNT排序查找前30、40、50条数据。结果却是第一个结果集的第2-30条数据是第二个结果集的12-40条数据。第二个结果集的第2-40条数据是第3个结果集的第12-50条数据(BIZ_VIEW_COUNT都为0)。由此不难找出一些规律。但是发现网上有人查出的数据又和这个规律有略微的不同。望高人解答一下ORACLE的排序算法。
分享到:
相关推荐
在Oracle数据库中进行分页查询时,经常会出现性能瓶颈,尤其是在处理大数据量的情况下。本篇文章将详细探讨如何优化Oracle分页查询中的排序与效率问题。 #### 一、理解Oracle分页查询的基本原理 在Oracle中实现...
Oracle数据库在处理大数据量查询时,分页查询是一种常见的优化策略,目的是限制返回结果集的大小,加快查询速度,提供更好的用户体验。本文将详细探讨Oracle的分页查询语句及其存储过程。 首先,Oracle的分页查询...
在Oracle数据库中,SQL分页是一种非常常见的查询技术,它允许我们从大量数据中按需获取一部分结果,而不是一次性加载所有记录。这对于提高用户体验和优化系统性能至关重要,尤其是在处理大数据量的Web应用中。本实践...
Oracle 提供了多种方法实现分页查询,下面我们将详细探讨Oracle存储过程中的分页实现。 1. **ROWNUM伪列** 在早期的Oracle版本中,ROWNUM伪列被广泛用于分页。ROWNUM是在结果集生成时自动分配的,表示每一行的顺序...
本文将详细探讨三种常用的Oracle分页SQL方法:ROWNUM、ROWNUM结合子查询以及新引入的Oracle 12c的FETCH NEXT WITH OFFSET语法。这三种方法各有优缺点,适用于不同的场景。 1. ROWNUM方法: ROWNUM是Oracle中最基础...
在描述中提到的问题中,当使用`ORDER BY`对包含非唯一值的列进行排序,并结合分页查询时,发现不同页码的数据可能会有重复。这进一步证实了`ORDER BY`在Oracle中的不稳定特性。在没有唯一索引或主键约束的情况下,...
本文将深入探讨Oracle中的分页实现、存储过程、循环与游标的应用以及排序机制。 1. **分页原理** Oracle分页通常通过`ROWNUM`或`ROWNUMBER()`函数实现。`ROWNUM`是在查询执行时分配的,而`ROW_NUMBER()`是窗口函数...
在Java开发中,数据库操作是不可或缺的一部分,尤其是在处理大量数据时,分页查询显得尤为重要。Oracle作为一款广泛应用的关系型数据库,其高效的分页策略对于优化用户体验和减轻服务器压力具有显著效果。本文将深入...
本篇将深入探讨TERADATA和ORACLE这两种广泛应用的关系型数据库在实现分页查询时的方法。 TERADATA是一个并行数据库系统,以其高效的大数据处理能力著称。在TERADATA中,进行分页查询主要通过使用`TOP`或`LIMIT`...
在Oracle数据库中,分页查询是一项非常常见的操作,特别是在处理大量数据时,为了提高用户体验,我们需要将结果集分块加载,这就是所谓的分页。在这个Java和Oracle结合的分页实现中,我们将探讨如何通过Java后端配合...
Oracle数据库级分页是数据库管理中的一个重要概念,特别是在处理大量数据时,为了提高查询效率和用户体验,分页技术显得尤为关键。在Java开发中,我们通常利用JDBC(Java Database Connectivity)来实现这一功能。本...
本文将详细介绍如何使用Oracle进行有效的分页查询,并深入探讨其背后的原理及优化策略。 #### 分页查询的基本格式 对于Oracle的分页查询,我们可以遵循以下基本格式: ```sql SELECT * FROM ( SELECT A.*, ROWNUM...
这篇博客“Oracle存储过程通用分页”将深入探讨如何利用Oracle存储过程来实现高效、灵活的分页功能。 首先,理解分页的基本概念至关重要。分页是将大型数据集分成若干小块,每次只加载一部分数据到内存中,这样可以...
本教程将深入探讨如何在Java中调用Oracle存储过程来执行分页查询。 首先,我们需要理解分页的基本概念。分页是将大结果集分割成多个小部分,每次只加载一部分数据到内存中,这样可以减少内存消耗,提高响应速度。在...
本文将详细介绍一个特定的Oracle分页查询语句:“`select * from (select a.*,rownum rn from (select * from tablename) a where rownum) where rn>2`”,并对其背后的原理进行深入探讨。 #### 分页查询语句解析 ...
这里我们将深入探讨如何利用Oracle的存储过程来实现高效多条件的分页查询。 首先,理解分页的基本原理。分页通常涉及两个关键参数:当前页数(`PAGENUM`)和每页记录数(`RECORDSPERPAGE`)。通过这两个参数,我们...
Oracle数据库在处理大数据量时,分页查询是一个非常重要的功能,它可以提高网页加载速度,减少服务器负担,并提供更好的用户体验。本资源包含Oracle分页的`.cs`代码、存储过程以及Aspnetpager分页控件的使用示例,...
Oracle SQL分页语句是数据库查询中的一个重要概念,它允许我们从海量数据中按需获取特定范围的结果,比如第一页、第二页等。在Oracle数据库系统中,实现分页查询通常使用ROWNUM伪列或者结合RANK()、DENSE_RANK()、...
在Oracle数据库管理中,高效地实现分页查询是优化数据库性能的重要一环,尤其是在处理大量数据时。分页存储过程可以极大地提升用户体验,因为它允许用户逐步加载数据,而不是一次性加载所有记录,从而节省网络资源和...
下面将详细解析如何在Oracle中实现分页查询,并探讨其背后的原理及优化策略。 ### Oracle分页实现方法 #### 方法一:使用ROWNUM ROWNUM是Oracle中的一个伪列,它可以为结果集中的每一行分配一个唯一的行号。利用...