主流数据库分页查询介绍

1 背景概述

由于在项目中需要在页面上显示数量非常多的数据, 在进行数据库查询时首先会把所有的数据都查询出来,然后在进行显示,这时候分页查询的操作就必不可少了,本文介绍Mysql、Oracle、sql Server 三种数据库进行分页查询的用法。

2 预期读者

  1. 数通畅联内部员工
  2. 广大计算机爱好者

3 名词解释

  • 分页查询

就是将将过多的结果在有限的界面上分多页来显示,一般将分页查询分为两类:逻辑分页、物理分页。
    逻辑分页是在用户第一次访问时,将数据库的所有记录全部查询出来,添加到一个大集合中,然后存放在session对象,再通过页码计算出当前页需要显示的数据内容,存储到一个小的list的集合中,并将其存储到request对象中,跳转到JSP页面,进行遍历显示。 当用户第二次访问时,只要不关闭浏览器,还会从session中获取数据,来进行显示。因为此种方法是在内存的session对象中进行计算分页显示的,而不是真正的将我们数据库进行分页的,所以叫做逻辑分页。
    缺点:如果需要查询的数据量过大,session将耗费大量的内存;因为是在session中获取数据,如果第二次或者更多此的不关闭浏览器访问,会直接访问session,从而不能保证数据是最新的。
    优点:统一代码处理方式,较容易跨数据库做迁移。
    物理分页,使用数据库自身所带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。因为是对数据库的数据进行分页条件查询,所以叫物理分页。每一次物理分页都会去连接数据库。
优点:数据能够保证最新,由于根据分页条件会查询出少量的数据,所以不会占用太多的内存。

  • CTE(Common Table Expression,公用表表达式)

该表达式源自简单查询,可以认为是在单个 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 语句的执行范围内定义的临时结果集。CTE 与派生表类似,具体表现在不存储为对象,并且只在查询期间有效。与派生表的不同之处在于,CTE 可自引用,还可在同一查询中引用多次。

4 实现思路

通过物理分页的方法进行数据库查询。

5 实现步骤

首先通过开发平台新建一个工程,使用新工程中的系统日志模块作为样例,进行mysql和oracle的分页查询功能

5.1 Mysql

  • 在数据库中进行操作:

mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通用形式:

select o.* from (sql) o limit firstIndex,pageSize

其中的sql可以是单表查询的结果也可以是多表查询的结果
    firstIndex为显示结果的起始位置(mysql是从0作为起始位置的)
    pageSize为显示记录数
    直接对表进行查询如下,我们可以看到查询时间是0.005s


    采用分页查询,一页显示15条数据,查询时间是0.001s

  • 在工程中体现:

首先在工程中找到SystemLogQueryImpl.java这个类


    其中有一点需要注意,方法的返回值需要是PageList而不是List


    在开发平台中这个类是日志功能的服务实现类,


    其中,ec_p为页数,ec_rd为显示记录数
    staratNum为起始索引,endNum为结束索引
    由于MySQL的起始索引是从0开始的,需要对得到的起始索引减一,显示记录数的计算方法为: 结束索引-起始索引+1
    在sqlMap中的体现如图:


    在页面上的显示:


    可以在页面选择显示的页码和记录数

5.2 Oracle

Oracle的查询方法有两种:ROWNUM、row_number()

5.2.1 ROWNUM

  • 在数据库中进行操作:

查询语句通用形式:

select * from(select o.*,ROWNUM num from(sql) o where ROWNUM<=(endIndex)) where num>=firstIndex

直接对表进行查询,耗时16msecs


    采用分页算法进行查询是,耗时7msecs

  • 在工程中体现:

找到对应的服务实现类:


    服务实现类的内容:


    startNum为起始索引,endNum为结束索引
    因为ROWNUM方法中使用的两个参数一个是起始索引,一个是结束索引,所以可以直接使用。
    在sql中的体现:


    在页面上的效果:

5.2.2 row_number()

查询语句通用形式:

select * from(select * from(select t.*,row_number() over(order by orderColumn) as rownumber from(sql) t) p where p.rownumber>firstIndex) where rownum<=pageSize

直接对表进行查询,耗时22msecs


    使用分页查询语句进行查询,耗时12msece

  • 在工程中体现:

服务实现类的内容和ROWNUM一样,区别在sql中


    由于在sql中添加了order by排序函数,查询速率会变慢,所以在开发平台中不采用这种方法。
    对于oracle的分页查询,他们的主要区别是:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而函数row_number()在包含排序从句后是先排序再计算行号码。

5.3 Sqlserver

由于sqlserver版本比较多,分页查询的方式也有不同之处

5.3.1 Sqlserver 2005/2008中使用row_number()

查询通用形式:

SELECT * FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY orderColumn) AS RowNumber FROM tableName) EmployeePage WHERE RowNumber > =startIndex AND RowNumber <= endIndex ORDER BY orderColumn
GO

直接查询表,如图
 

    使用分页查询,如图

5.3.2 SQL 2005/2008用CTE的方式实现

查询通用形式:

WITH EmployeePage AS (SELECT *,ROW_NUMBER() OVER (ORDER BY orderColumn) AS RowNumber FROM tableName)
SELECT *FROM EmployeePage WHERE RowNumber > =firstIndex AND RowNumber <= endIndex ORDER BY orderColumn
GO

使用分页查询,如图:

5.3.3 SQL SERVER 2012支持了OFFSET

查询通用形式,如下:

SELECT * FROM tableName
ORDER BY orderColumn
OFFSET (page-1) ROWS FETCH NEXT size ROWS ONLY

Page指需要显示的页数
    Size指需要显示的记录数
     由于本人现在没有sqlserver 2012的数据库,暂时无法做性能的测试

6 附件及说明

附件中有两个样例工程pagingquery4mysql和pagingquery4oracle,使用最新版的aeai dp开发平台导入后查看使用。

主流数据库分页查询介绍文档及附件       下载

时间: 2024-10-24 17:35:24

主流数据库分页查询介绍的相关文章

MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)

一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数.例如:select * from table WHERE … LIMIT 10; #返回前10行select * from table WHERE … LIMIT

数据库分页查询方法

在这里主要讲解一下MySQL.SQLServer2000(及SQLServer2005)和ORCALE三种数据库实现分页查询的方法. 可能会有人说这些网上都有,但我的主要目的是把这些知识通过我实际的应用总结归纳一下,以方便大家查询使用. 下面就分别给大家介绍.讲解一下三种数据库实现分页查询的方法. 一. MySQL 数据库分页查询 MySQL数据库实现分页比较简单,提供了LIMIT函数.一般只需要直接写到sql语句后面就行了. LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有

各种数据库分页查询sql语句大全

在显示记录条目时往往要用到分页,一种常用的办法是利用各种数据库自带的定位接口对原始查询语句进行改写,从而只取出特定范围的某些记录.不同的数据库,查询定位接口是不一样的,下面做一汇总: 数据库 分页查询语句 说明 MySQL    "QUERY_SQL limit ?,?"            使用limit关键字,第一个"?"是起始行号, 第二个"?"是返回条目数 Oracle SELECT * FROM ( SELECT A.*, ROWNU

数据库分页查询

分页语句: Oracle: --这种分页查询方式不仅仅是针对单表的简单查询,对于最内层查询是复杂的 --多表联合查询或最内层查询包含排序的情况一样有效 SELECT * FROM ( SELECT ROWNUM RN , T.*  FROM (SELECT * FROM FTNEMR.PATIENT_VISIT) T WHERE ROWNUM <= 40 ) WHERE RN >= 21 ORDER BY PATIENT_ID; --这种方式比上面的方式要性能要低很多 SELECT * FRO

mssql数据库分页查询效率的一次体会

这几天在一个项目,合同管理系统(是对老系统的升级和改造,老系统是VS2008做的),由于数据库的表是项目组根据老系统的数据库建的,所以在查询的适合我就需要自己创建视图来完成多表的查询,起初我是读取项目组成员建好的视图,里面有7张表,其中还包含视图,由于视图中join视图是不支持索引的,所以在查询第一页的时候(每一页20条数据,总共数据量是10W条左右),耗时800毫秒,但是 当row_number达到上千的时候,基本查询要6秒以上,每点击下一页,耗时会增加十几毫秒,到40000条也就是中间的时候

Yii2数据库分页操作方法介绍

本章节将介绍如何如何创建一个从数据表 country 中获取国家数据并显示出来的页面.为了实现这个目标,你将会配置一个数据库连接,创建一个活动记录类,并且创建一个操作及一个视图. 贯穿整个章节,你将会学到: 配置一个数据库连接 定义一个活动记录类 使用活动记录从数据库中查询数据 以分页方式在视图中显示数据 请注意,为了掌握本章你应该具备最基本的数据库知识和使用经验.尤其是应该知道如何创建数据库,如何通过数据库终端执行 SQL 语句. 准备数据库 首先创建一个名为 yii2basic 的数据库,应

各种数据库分页查询方法

具体实现中,根据所用数据库.数据量.实现分页方式,选择分页实现快的方式实现. 一.MYSQL分页查询方法 MYSQL分页查询主要使用其自带的limit函数,但需根据查询量来决定具体的使用方式,如只有几千或几万数据,则直接用 limit m,n方式, 如数据量较多,则要注意limit的使用方式. // limit m , n:从第 m 条数据开始,获取 n 条数据 1.数据量少的方式:select * from tablename limit m,n; // limit m , n:m 可省略,省

JavaWeb分页显示内容——数据库分页查询

转载请注明原文地址: 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出来.当数据少时,可以在一个页面内显示完成.然而,如果查询记录是几百条.上千条呢?直接一个页面显示完全的话,表格得多长啊......这时,我们可以用分页技术. 何为分页?效果图如下: 这里总共查询了100条记录,如果一次性显示的话表格会很多行,用户体验不佳.而我们采用分页显示的话,一页显示10条记录,共十页.用户可以自行翻阅,记录少,清晰显示. 下面谈谈分页效果的实现,思路有两种: 其一:

各种数据库的数据库分页查询

数据查询的时候,才用数据库分页,能减轻数据过大对程序的影响,避免内存溢出的出现. 下面各种数据库的字段说明: 1.表historyPacking,包含字段cardNumber flag... 2.表pickaddress,包含字段 pickaddressid... 1.sql server 2005(不支持2000,支持2005以上版本): select * from (select *, ROW_NUMBER() OVER(Order by a.time DESC ) AS RowNumber