`
学会做人
  • 浏览: 121167 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Oracle row_number() over()解析函数高效实现分页

阅读更多

在刚出来工作时! 大多数人只知道用rownum 来进行分页,或是sql嵌套来分页
后来觉得效率挺低的。而且rownum是先分配行号,再进行排序!
一句话麻烦!

后来我再对数据库特殊sql的研究之后,觉得我以前的3层嵌套实现分页的效率也是很低的,

直到用了  row_number() over(partition by xx  order by xxx desc/asc)
函数之后,才觉得这种方法是最简单和效率最高的!

当然也举一个实例来比较一下

create table T_NEWS
(
  ID      NUMBER,
  N_TYPE  VARCHAR2(20),
  N_TITLE VARCHAR2(30),
  N_COUNT NUMBER
)
;
prompt Disabling triggers for T_NEWS...
alter table T_NEWS disable all triggers;
prompt Loading T_NEWS...
insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT)
values (1, 'IT', '爱it1', 100);
insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT)
values (2, '体育', '爱体育1', 10);
insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT)
values (3, '体育', '爱体育2', 30);
insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT)
values (4, 'IT', '爱it2', 300);
insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT)
values (5, 'IT', '爱it3', 200);
insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT)
values (6, '体育', '爱体育3', 20);
insert into T_NEWS (ID, N_TYPE, N_TITLE, N_COUNT)
values (7, '体育', '爱体育4', 60);
commit;


第一步:我先用rownum

--分页 row_number,不是rownum
--根据n_count从大到小排列,每页3条
SELECT ROWNUM r,t.* FROM t_news t
WHERE ROWNUM<=3
ORDER BY t.n_count DESC
--问题:为什么order by以后,行号是乱的?
SELECT ROWNUM r,t.* FROM t_news t
--原因:先分配了行号,再根据n_count排序

--所以必须排序,再生成行号
SELECT ROWNUM r,t.* FROM (
   SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t

--分页
--err
SELECT ROWNUM r,t.* FROM (
   SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t
WHERE r between 1 AND 3

--第1页
SELECT ROWNUM r,t.* FROM (
   SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t
WHERE ROWNUM between 1 AND 3

--第2页
SELECT ROWNUM r,t.* FROM (
   SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t
WHERE ROWNUM between 4 AND 6
--error: ROWNUM必须从1开始!
SELECT k.* FROM (
SELECT ROWNUM r,t.* FROM (
   SELECT t.* FROM t_news t ORDER BY t.n_count DESC  ) t
) k
WHERE r BETWEEN 4 AND 6

--麻烦,效率低!


*****第二步:我用row_number() over()函数
select t2.* from
    (select t.*,row_number()over(order by t.n_count desc) orderNumber from t_news t order by t.n_count desc)t2 where orderNumber  between 1and 3;


*****************************************************************************************************************************************88
SELECT * FROM (
  SELECT  t.*,row_number() over(ORDER BY n_count DESC) r
  FROM t_news t
  ORDER BY t.n_count DESC
) t
WHERE r BETWEEN 4 AND 6

--通用语法: 解析函数() over(partition by 字段  order by 字段)






t2

 

分享到:
评论
5 楼 liguocai2009 2012-08-16  
liguocai2009 写道
经过我我的测试,600万的数据,row_number()耗时4.5秒,而rownum只是消耗了0.8秒

而且是取最后一页。
4 楼 liguocai2009 2012-08-16  
经过我我的测试,600万的数据,row_number()耗时4.5秒,而rownum只是消耗了0.8秒
3 楼 学会做人 2012-04-25  
lbs1988 写道
扯淡 谁说row_number() over 效率高 他们效率是一样的 row_number() over少嵌套一层而已

你用上千万条数据试试
2 楼 lbs1988 2012-03-16  
扯淡 谁说row_number() over 效率高 他们效率是一样的 row_number() over少嵌套一层而已
1 楼 id0096 2010-04-20  
没觉得效率高到哪里去...用180W条数据测试,很多情况下没有3层嵌套的效率高..
莫非和索引有关系??

相关推荐

    oracle分析函数row_number() over()使用

    Oracle的分析函数`ROW_NUMBER() OVER()`是一种强大的工具,用于在查询结果集中为每一行分配一个唯一的序列号。这个函数通常用于数据分页、排名或者为特定条件的记录分配顺序。下面我们将详细讨论`ROW_NUMBER() OVER...

    解析函数高效实现分页

    本文将详细介绍如何利用Oracle中的`ROW_NUMBER()`解析函数来实现高效的分页功能,并通过示例对比不同分页方法的优劣。 #### 传统分页方法的问题 1. **ROWNUM方法**: - **原理**:通过`ROWNUM`为结果集中的每一行...

    深入探讨:oracle中row_number() over()分析函数用法

    Oracle数据库中的`row_number() over()`分析函数是一个非常实用的工具,用于为数据集中的每一行分配一个唯一的整数,这个数字基于指定的排序条件。在处理大数据集时,它可以帮助我们进行分页、排名或者在复杂的查询...

    使用row_number()实现分页实例

    总之,`ROW_NUMBER()`函数在SQL Server中是实现高效分页查询的重要工具。通过正确地设置参数和理解其工作原理,可以轻松地在大量数据中实现分页浏览,提高用户体验。同时,要注意不同数据库系统可能存在的语法差异,...

    各数据库分页语法支持

    Oracle 支持多种分页方式,包括三层嵌套分页、ROW_NUMBER() 函数分页及 ROWNUM 控制最大条数的方法。 1. **三层嵌套分页**: ```sql SELECT * FROM ( SELECT row_.*, ROWNUM as rownum FROM ( SELECT sid ...

    oracle 高效分页

    高效分页在Oracle数据库中是通过利用如`ROW_NUMBER()`这样的窗口函数或`ROWNUM`伪列来实现的。为了更好地管理大型数据集的查询,开发者应熟悉这些技术,并根据具体需求选择最合适的方案。此外,封装分页逻辑到存储...

    oracle分页程序的实现

    在Oracle数据库中,常见的分页查询方法有ROWNUM和ROW_NUMBER()函数,以及使用子查询和连接操作来实现分页。 1. ROWNUM方法: ROWNUM是Oracle中的内置伪列,它会为每一行数据生成一个唯一的数字,从1开始递增。但...

    Oracle数据库rownum和row_number的不同点

    在Oracle数据库中,`ROWNUM` 和 `ROW_NUMBER()` 是两个不同的概念,它们在处理结果集的排序和分页方面有着显著的区别。 首先,`ROWNUM` 是Oracle数据库中的一个伪列,它在查询执行的过程中动态生成。当查询执行时,...

    Oracle 存储过程分页

    总结,Oracle 存储过程中的分页实现有很多种方式,包括ROWNUM、ROW_NUMBER()、CTE、FETCH FIRST子句,以及JOIN和游标等。选择哪种方法取决于具体的需求,如数据库版本、性能需求、查询复杂性等因素。正确使用分页...

    Oracle分页

    总结来说,Oracle分页主要通过ROWNUM和ROW_NUMBER()函数实现,其中ROW_NUMBER()更为灵活且适用于复杂场景。合理利用索引和动态分页策略,可以提高查询效率和用户体验。在设计分页系统时,需兼顾性能和用户体验,为...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    Oracle 12c引入了窗口函数ROW_NUMBER(),可以更优雅地实现分页。例如: ```sql WITH data AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY some_column) row_num FROM your_table ) SELECT * FROM data WHERE row_...

    分页代码Oracle

    理解分页的基本原理和Oracle提供的函数,结合实际编程环境,可以有效地实现高效、灵活的分页功能。对于初学者而言,可能需要一定的实践和调试才能完全掌握,但随着经验的增长,你会发现分页查询其实并不复杂。

    oracle分析函数

    ### Oracle分析函数详解:row_number() over 在Oracle数据库中,分析函数(Analytic Functions)是一种强大而灵活的数据处理工具,它们能够在查询结果集中对每一行数据进行计算,而不像传统的聚合函数那样只返回...

    Oracle数据库通用的分页存储过程

    Oracle数据库中实现分页查询主要有两种方法:ROWNUM和ROW_NUMBER()函数,这里我们主要讨论通过存储过程实现的通用分页方法。 一、ROWNUM方法 ROWNUM是Oracle数据库中的一个伪列,它会为每一行分配一个唯一的整数,...

    oracle分页查询

    Oracle 12c 及更高版本支持 ROW_NUMBER() 函数,可以用来实现分页查询。基本格式如下: ```sql SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY COLUMN_NAME) RN FROM TABLE_NAME) WHERE RN BETWEEN 21...

    Oracle&JSP分页和Oracle分页

    另一种更高效的方法是使用Oracle的`ROW_NUMBER()`函数,配合`OVER()`子句,这样可以实现更复杂的分页逻辑。比如,如果我们要查询第5页的数据,每页20条,可以这样写: ```sql SELECT * FROM ( SELECT ROW_NUMBER()...

    Oracle 高效分页存储过程(修改)

    在Oracle数据库管理中,高效地实现分页查询是优化数据库性能的重要一环,尤其是在处理大量数据时。分页存储过程可以极大地提升用户体验,因为它允许用户逐步加载数据,而不是一次性加载所有记录,从而节省网络资源和...

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

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

Global site tag (gtag.js) - Google Analytics