首页 > 数据库 >【一学就会】Oracle通过伪列ROWNUM来实现分页功能

【一学就会】Oracle通过伪列ROWNUM来实现分页功能

时间:2024-11-03 23:17:50浏览次数:4  
标签:一学 分页 伪列 查询 索引 Oracle ROWNUM SELECT

本人详解
作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》
公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题
中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯
转载说明:务必注明来源(注明:作者:王文峰哦)

【一学就会】Oracle通过伪列ROWNUM来实现分页功能

在这里插入图片描述

学习教程(传送门)

1、掌握 JAVA入门到进阶知识(持续写作中……
2、学会Oracle数据库用法(创作中……
3、手把手教你vbs脚本制作(完善中……
4、牛逼哄哄的 IDEA编程利器(编写中……
5、吐血整理的 面试技巧(更新中……

【一学就会】Oracle通过伪列ROWNUM来实现分页功能

一、分页查询简介

在Oracle数据库中,分页查询是一种常用的数据检索方式,允许用户按照指定的页数和每页显示的行数来获取特定的数据。Oracle通过伪列ROWNUM来实现分页功能,ROWNUM为查询结果的每一行分配一个唯一的行号,基于这些行号可以实现分页查询。

二、分页查询实现步骤

1. 准备基础查询

首先,需要编写一个基本的查询语句来获取所有的数据,这个查询语句将作为分页查询的内层查询。

SELECT * FROM 表名;

2. 使用ROWNUM分配行号

在基础查询的基础上,使用ROWNUM为每一行分配一个唯一的行号。这个步骤通常作为分页查询的中间层查询。

SELECT mt1.*, ROWNUM AS rn FROM (基础查询) mt1;

3. 筛选特定行号范围

在外部查询中,使用WHERE子句来筛选出特定的行号范围,以实现分页查询。这里的行号范围由分页参数决定,如每页的起始行号和结束行号。

SELECT * FROM (中间层查询) WHERE rn BETWEEN :start_row AND :end_row;

其中,:start_row:end_row是分页参数,分别表示每页的起始行号和结束行号。

4. 设置分页参数和计算总页数

为了实现更好的分页体验,通常需要设置分页参数并计算总页数。分页参数包括每页显示的行数(:page_size)和当前页码(:page_number)。总页数可以通过总行数除以每页显示的行数并向上取整来计算。

-- 计算总行数
SELECT COUNT(*) AS total_rows FROM 表名;

-- 计算总页数
SELECT CEIL(COUNT(*) / :page_size) AS total_pages FROM 表名;

5. 完整的分页查询示例

以下是一个完整的分页查询示例,展示了如何在Oracle中实现分页查询:

-- 设置分页参数
:page_number := 1; -- 当前页码
:page_size := 10;  -- 每页显示的行数
:start_row := (:page_number - 1) * :page_size + 1;
:end_row := :page_number * :page_size;

-- 执行分页查询
SELECT * FROM (
    SELECT e.*, ROWNUM AS rn FROM (
        SELECT * FROM employees ORDER BY employee_id
    ) e
) WHERE rn BETWEEN :start_row AND :end_row;

-- 计算总行数和总页数(可选)
SELECT COUNT(*) AS total_rows, CEIL(COUNT(*) / :page_size) AS total_pages FROM employees;

在上面的示例中,我们首先设置了分页参数:page_number:page_size,然后计算出:start_row:end_row。接着,我们执行了分页查询,并可选地计算了总行数和总页数。

当然,以下是一些具体的Oracle查询优化示例,包括索引优化、查询重写、分页查询优化等方面的内容:

5、索引优化示例

场景:有一个名为employees的表,包含employee_idfirst_namelast_namedepartment_id等列。经常需要根据last_name进行查询。

优化前

SELECT * FROM employees WHERE last_name = 'Smith';

优化后

  1. last_name列上创建索引。
CREATE INDEX idx_last_name ON employees(last_name);
  1. 执行查询。
SELECT /*+ INDEX(employees idx_last_name) */ * FROM employees WHERE last_name = 'Smith';

(注意:在Oracle中,可以使用提示(hint)来强制查询使用特定的索引,但通常建议让Oracle优化器自行选择最佳执行计划。这里的示例仅用于演示如何指定索引。)

6、查询重写示例

场景:有一个名为orders的表,包含order_idcustomer_idorder_date等列。需要查询某个客户的所有订单,并且这些订单在某个日期之后。

优化前

SELECT * FROM orders WHERE customer_id = 123 AND order_date > TO_DATE('2023-01-01', 'YYYY-MM-DD');

优化后
如果customer_idorder_date列上已经有合适的索引,那么上面的查询已经足够高效。但是,如果查询条件经常变化,或者需要更复杂的过滤条件,可以考虑使用WITH子句(公用表表达式CTE)或临时表来简化查询。

不过,在这个特定场景中,更直接的优化可能是确保customer_idorder_date列上有联合索引(如果查询经常同时涉及这两个条件)。

-- 创建联合索引(如果尚未创建)
CREATE INDEX idx_customer_order_date ON orders(customer_id, order_date);

-- 执行查询(无需重写,因为索引已经优化)
SELECT * FROM orders WHERE customer_id = 123 AND order_date > TO_DATE('2023-01-01', 'YYYY-MM-DD');

7、分页查询优化示例

场景:有一个名为products的表,包含大量产品记录。需要分页显示这些记录。

优化前(使用ROWNUM,适用于Oracle 12c之前):

SELECT * FROM (
    SELECT a.*, ROWNUM rnum FROM (
        SELECT * FROM products ORDER BY product_name
    ) a WHERE ROWNUM <= :endRow
) WHERE rnum >= :startRow;

其中,:startRow:endRow是分页参数。

优化后(使用OFFSET和FETCH,适用于Oracle 12c及更高版本):

SELECT * FROM products ORDER BY product_name OFFSET :offsetRows ROWS FETCH NEXT :fetchRows ROWS ONLY;

其中,:offsetRows表示要跳过的行数(即(pageNumber - 1) * pageSize),:fetchRows表示要返回的行数(即pageSize)。

注意:对于大数据量的表,分页查询可能会变得非常慢,特别是当OFFSET值很大时。在这种情况下,可以考虑使用基于索引的分页方法(如基于主键或唯一索引列的分页),或者对表进行分区。

定期维护索引

  • 可以使用Oracle的DBMS_STATS包来收集表和索引的统计信息,帮助优化器做出更好的决策。
  • 定期检查索引的碎片情况,并考虑重建或重组索引。

监控查询性能

  • 使用Oracle的AWR(Automatic Workload Repository)报告来分析数据库的性能瓶颈。
  • 监控SQL语句的执行时间和资源消耗,找出性能较差的查询并进行优化。

这些示例展示了如何通过索引优化、查询重写、分页查询优化以及实践建议来提高Oracle查询的速度和效率。在实际应用中,需要根据具体的场景和需求来选择合适的优化方法。

三、注意事项

  1. ROWNUM限制:ROWNUM只能在查询结果生成后分配,因此不能在WHERE子句中直接使用ROWNUM > n(n
  2. 0)这样的条件,需要使用子查询来间接实现。

  3. 性能优化:对于复杂的查询,可以考虑使用索引、优化查询语句等方式来提高性能。此外,对于分页查询的最后几页,采用HASH JOIN的方式可能更高效。
  4. 排序稳定性:当用来排序的列存在值相等的行时,可能会造成数据重复出现。为了避免这种情况,可以在排序时增加一个唯一标识列(如主键或ROWID)。

四、总结

Oracle分页查询是一种强大的数据检索方式,通过伪列ROWNUM和分页参数可以实现灵活的分页功能。在使用分页查询时,需要注意ROWNUM的限制、性能优化以及排序稳定性等问题。通过合理的设置和使用分页查询,可以方便地获取所需的数据并提高查询效率。

学习教程(传送门)

1、掌握 JAVA入门到进阶知识(持续写作中……
2、学会Oracle数据库用法(创作中……
3、手把手教你vbs脚本制作(完善中……
4、牛逼哄哄的 IDEA编程利器(编写中……
5、吐血整理的 面试技巧(更新中……
在这里插入图片描述

往期文章

 第一章:日常_JAVA_面试题集15(含答案)
 第二章:日常_JAVA_面试题集14(含答案)
平安壹钱包面试官:请你说一下Mybatis的实现原理
Java开发-热点-热门问题精华核心总结-推荐
 往期文章大全……
在这里插入图片描述

一键三连 一键三连 一键三连~
在这里插入图片描述

本人详解
作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》
公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题
中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯
转载说明:务必注明来源(注明:作者:王文峰哦)

一键三连 一键三连 一键三连~
以上就是今天的内容,关注我,不迷路

标签:一学,分页,伪列,查询,索引,Oracle,ROWNUM,SELECT
From: https://blog.csdn.net/Feng_wwf/article/details/143311181

相关文章

  • Oracle OCP认证考试考点详解082系列09
    题记:本系列主要讲解OracleOCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。41.第41题:题目41.ExaminethedescriptionoftheEMPLOYEEStableNLS_DATE_FORMATissettoDD-MON-YYWhichqueryrequiresexplicit_datatypeconversion?A.SELECTjoin_date......
  • Oracle 第19章:高级查询技术
    在Oracle数据库中,高级查询技术是数据库管理员和开发人员必须掌握的重要技能。这些技术能够帮助优化查询性能,简化复杂的查询逻辑,并提高数据处理的效率。本章将重点讨论两个关键概念:子查询和连接与并集操作。子查询定义:子查询(Subquery)是指嵌套在另一个SQL语句中的查询。子......
  • 图文深入介绍Oracle DB link(三)
    1.引言:本文承接上篇继续深入介绍OracleDBlink,主要介绍如何应用好DBLINK。2.OracleDBlink的应用场景1.数据迁移与整合企业数据仓库建设在构建企业数据仓库时,数据通常来源于多个不同的业务系统数据库。这些业务系统可能基于不同的数据库管理系统(DBMS),但如果都是O......
  • OracleJDK与OpenJDK的区别(附带win11下多版本jdk安装)
    OracleJDK与OpenJDK的区别(附带win11下多版本jdk安装)在Java开发领域,OracleJDK与OpenJDK是两个常被提及的名词,它们都是Java开发工具包(JDK)的实现,但各自具有不同的特点和优势。在早期的java开发中(java8以前)默认使用的jdk都是Oracle公司的jdk,由于当时免费,被应用在大多数企业项目......
  • Oracle 第18章:分区技术
    Oracle分区技术详解Oracle数据库中的分区技术是一种将大表或索引物理地划分为更小、更易管理的部分的方法。这种技术不仅提高了查询性能,还简化了数据库的维护工作。下面我们将从分区的优势、应用场景以及如何创建和维护分区等方面进行详细介绍。1.分区的优势提高查询......
  • Oracle与GreatSQL差异:更改唯一索引列
    Oracle与GreatSQL差异:更改唯一索引列1.问题来源在从Oracle迁移到GreatSQL的应用系统中,一条普通的update语句在GreatSQL中却报错,需要进行SQL语句的改写。把实际问题简化为下面简单情况进行说明。在Oracle下,可以正常执行的update语句。--建表CREATETABLEtest.test1(id......
  • Oracle 第14章:并发控制
    在Oracle数据库中,并发控制是一个关键概念,因为它确保了多个用户或事务可以同时访问数据库而不干扰彼此的工作。并发问题主要出现在多用户环境中,当多个事务试图同时修改相同的数据时可能发生数据不一致的问题。并发问题及解决方案并发问题:脏读(DirtyReads):一个事务读取了另......
  • Oracle数据库AWR报告中高等待事件优化方法
    一、理解等待事件什么是等待事件在Oracle数据库中,等待事件是指会话在执行SQL语句时,由于某些资源(如磁盘I/O、锁、缓冲区等)暂时不可用而必须等待的情况。AWR报告中的等待事件部分可以帮助我们识别数据库性能瓶颈的关键所在。确定高等待事件类型常见的高等待事件包括:......
  • Oracle、MySQL、ClickHouse的通用AES256加解密如何实现?
     Oracle、MySQL、ClickHouse的通用AES256加解密如何实现? 前段时间研究了加密算法aes,写了个文档,分享到博客上来。防。1  说明应XXX安全生产需求,对目标库目标表业务字段敏感信息进行加密密文存放,查询时通过解密得到明文进行数据使用,要求使用AES256。目前公司所使用主要......
  • 文本列的性能优化?深入Oracle全文索引
    一.什么是全文索引?全文索引通过分析和处理文本,将文档中的单词分解为词条(tokens),然后存储词条与其所在文档的映射关系。这使得数据库可以快速定位包含特定关键字的记录,而不必对所有文本逐字匹配。二.实验CREATETABLEtest(TEST_IDNUMBER(6),TEST_NAMEVARCHAR2......