`
灵雨飘零
  • 浏览: 35104 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
文章分类
社区版块
存档分类
最新评论

从网上搜集的几种数据分页的总结

 
阅读更多

从网上搜集了两篇关于数据库分页性能分析总结的文章,分页方式大同小异。

第一篇、转载自comaple的博客

本试验在于探讨分页的性能问题,当然客户端分页也是一种分页的策略。不过这种分页方式已经过时了,建议不要采用。这里我们只讨论服务器端分页。

实验环境:

Pentium(R) dual-Core CPU E5300 @ 2.6GHz 2.59GHz, 2.00GB内存

SqlServer2008 数据库环境,数据库中我们要用到的的表:

dbo.GMpipe

CREATE TABLE [dbo].[GMpipe](

[GMDataID] [uniqueidentifier] NOT NULL,

[pointID] [uniqueidentifier] NULL,

[measurePipe] [varchar](10) NULL,

[measureTime] [datetime] NULL,

[measureCycle] [varchar](10) NULL,

[MeasureData] [int] NULL,

[doseRateValue] [decimal](18, 10) NULL,

CONSTRAINT [PK_GMPIPE] PRIMARY KEY CLUSTERED

(

[GMDataID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

目前该表中存在1157226条数据,用select语句查询耗时为:17s

SELECT * FROM dbo.GMpipe ORDER BY measureTime DESC

接下来我们就来一起体验一下把:

第一种方式


使用top语句(本文只列出常用的):

分页的存储过程,已实现好了如下:

CREATE PROCEDURE paging1

@pageNum INT –-页码

,@Num INT --每页条数

AS

BEGIN

SELECT TOP (@Num) * FROM

(

SELECT TOP (@Num*@pageNum) * FROM dbo.GMpipe ORDER BY dbo.GMpipe.measureTime asc

) b ORDER BY b.measureTime DESC;

END

go

这个中方法先把数据库中的前@Num*@pageNum条数据取出,再从结果集中取出最后的@Num条数据,当然两个排序规则是不一样的这点很重要,不然起不到分页效果。 你可以具体试一下就明白了。

看性能
EXEC paging1 2,5;--每页五条,第十页数据 耗时:1s

EXEC paging1 200,5;--每页五条,第200页数据 耗时:1s

EXEC paging1 20000,5;--每页五条,第20000页数据 耗时:1s

EXEC paging1 200000,5;--每页五条,第二十万页数据 耗时: 3s

第二中方式


使用临时表

分页的存储过程,实现如下:

CREATE PROCEDURE paging2

@pageNum INT

,@Num INT

AS

BEGIN

SELECT measurePipe,measureTime,measureCycle,MeasureData,doseRateValue,IDENTITY(int) Num INTO #temp FROM dbo.GMpipe ORDER BY measureTime ASC

SELECT * FROM #temp WHERE Num<=@Num*@pageNum AND Num> @Num*(@pageNum-1)

ORDER BY Num ASC

DROP TABLE #temp

END

Go

这种方式是将表中的数据全部查出,然后加入标识行号的列Num并将其装入临时表#temp中然后可根据行号列进行分页查询。

看性能
EXEC paging2 2,5;--每页五条,第二页数据 耗时:3s

EXEC paging2 200,5;--每页五条,第二百页数据 耗时:3s

EXEC paging2 20000,5;--每页五条,第二万页数据 耗时:3s

EXEC paging2 200000,5;--每页五条,第二十万页数据 耗时:3s


第三种方式


采用系统提供的ROW_NUMBER()函数

存储过程实现如下:

CREATE PROCEDURE paging0

@pageNum INT

,@Num INT

AS

begin

SELECT * FROM

(

SELECT measurePipe,measureTime,measureCycle,MeasureData,doseRateValue,ROW_NUMBER() OVER(ORDER BY GMpipe.measureTime ASC ) AS NUM

FROM GMpipe)A

WHERE A.NUM<=@Num*@pageNum AND A.NUM> @Num*(@pageNum-1) ORDER BY A.measureTime desc

END

Go

这种方式就不多说了大家一看就明白,直接看性能。

看性能
EXEC paging0 20,5;--每页五条,第二十页数据 耗时: 1s

EXEC paging0 20000,5;--每页五条,第二万页数据 耗时: 1s

EXEC paging0 200000,5;--每页五条,第二十万页数据 耗时: 1s


改进第三种方式:

之所以要改进第三种方式那是因为,Top关键字其实是

已经经过性能优化了的之所以比不过ROW_NUMBER()的执行效率是因为用了两次,那么既然如此,我们何不将二者结合起来使用,效果岂不更佳。那就让我们改进一下吧。

CREATE PROCEDURE paging0

@pageNum INT

,@Num INT

AS

begin

SELECT * FROM

(

SELECT TOP (@Num*@pageNum) measurePipe,measureTime,measureCycle,MeasureData,

doseRateValue,ROW_NUMBER() OVER(ORDER BY GMpipe.measureTime ASC ) AS NUM

FROM GMpipe)A

WHERE A.NUM> @Num*(@pageNum-1) ORDER BY A.measureTime desc

END

Go

这样一来执行效率更高了呵呵!

总结

我们再来改变一下每页的条数看看

临时表方式:

EXEC paging2 5000,200;--每页两百条,第五千页数据 耗时:7s

Top语句方式:

EXEC paging1 5000,200;-- 每页两百条,第五千页数据 耗时: 3s


ROW_NUMBER()函数方式:

EXEC paging0 5000,200;--每页五条,第二十万页数据 耗时:1s


分析:这样我们就能看到很清楚了吧,影响top语句方式的因素是你要取的页数,即越靠后耗时也明显。影响临时表的因素则比较多了首先是数据的总条数,其次是分页方式即每页的数据量。而ROW_NUMBER()函数的影响则可能只有总的数据量,并且性能可是不错的哦!

我想对与一般的系统而言二十万页的数据分页量已经够用了吧,呵呵!再多的话我们也看不过来啊

第二篇、转载载源自李洪根的blog

SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点
建立表:

CREATE TABLE [TestTable] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

插入数据:(2万条,用更多的数据测试会明显一些)
SET IDENTITY_INSERT TestTable ON

declare @i int
set @i=1
while @i<=20000
begin
insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
set @i=@i+1
end

SET IDENTITY_INSERT TestTable OFF

-------------------------------------

分页方案一:(利用Not In和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID

-------------------------------------

分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID


SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID


-------------------------------------

分页方案三:(利用SQL的游标存储过程分页)
create procedure XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int,--第N页
@pagesize int--每页行数
as
set nocount on
declare @P1 int,--P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(
1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off

其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。

通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用

在实际情况中,要具体分析。

********************************************************************

只是把文章转载了一下,没有再加整理。希望对开发有所启发和帮助!

分享到:
评论

相关推荐

    收集的几种分页样式,非常漂亮

    "收集的几种分页样式,非常漂亮"这个主题聚焦于美观且实用的分页设计,特别是其中的一款模仿百度的熊爪足迹样式,为用户提供了一种独特的交互体验。 1. **分页的基本概念**:分页通常包含“上一页”,“下一页”...

    大数据量多线程执行分页查询

    在实际应用中,实现大数据量多线程分页查询的过程可能包括以下几个步骤: 1. **设计数据库表结构**:根据需求创建合适的表结构,合理利用索引以优化查询性能。 2. **实现分页查询**:使用SQL的`LIMIT`(MySQL)或`...

    jsp 分页网上收集的

    JSP分页是Web应用中处理大数据集的一种有效方式。通过合理构建SQL查询和使用自定义Bean对象,可以实现高效的数据展示和良好的用户体验。上述代码示例展示了如何在JSP中实现分页,特别是针对日历事件的展示。然而,...

    私人用的分页标签,网上搜集

    在“私人用的分页标签,网上搜集”这个主题中,我们可以探讨以下几个重要的分页相关知识点: 1. **分页的基本原理**:分页的核心思想是将大量数据分割成若干个小部分,每个部分称为一个“页”,然后通过页码或导航...

    网络游戏-一种网络数据定向分页式采集方法.zip

    标题中的“网络游戏-一种网络数据定向分页式采集方法”暗示了这个压缩包内容主要涉及网络游戏数据的抓取和处理,特别是通过定向分页式采集技术。这种技术在数据分析、市场研究、游戏优化等领域有着广泛应用。现在,...

    Javascript分页效果(收集了很多强大的JS分页代码)

    在网页设计中,分页是一种常见的功能,用于管理大量数据或内容,避免一次性加载过多信息导致页面加载速度变慢。这个压缩包中包含了多个JavaScript分页代码示例,适合网页开发者参考和直接应用。 分页效果的实现通常...

    flex PDF导出分页

    Flex PDF导出分页是一种在Flex应用程序中生成PDF文件并实现多页显示的技术。Flex作为一个基于ActionScript和Flash Player的开发框架,常用于构建富互联网应用程序。然而,原生的Flex SDK并不直接支持PDF导出,因此...

    android_登录_注册+gridview分页

    在Android应用开发中,"登录_注册+gridview分页"是常见的功能需求,涉及到用户交互界面设计和数据展示优化。下面将详细讲解这个主题的相关知识点。 首先,我们来看“登录_注册”部分。在Android应用中,登录和注册...

    Html表格及分页收集.pdf

    《HTML表格与分页技术...HTML表格提供了一种简单的方式来组织和展示数据,而分页则在数据量大时提高了页面的性能和用户体验。通过结合JavaScript和服务器端技术,可以实现更复杂的功能,如动态加载数据、用户交互等。

    基于ASP的无刷新ajax分页

    在网页开发中,分页是一种常见的数据展示方式,尤其在处理大量数据时,它能帮助用户更有效地浏览和管理内容。传统的分页方式通常需要用户每次点击页码时页面整体刷新,这可能导致用户体验下降,因为页面加载时间较长...

    Oracle分页查询技术

    为了提高查询效率,可以采取以下几种策略: 1. **添加索引**:为经常用于排序或分组的列添加索引,这样可以减少扫描整个表的次数。 2. **使用子查询**:通过子查询预先过滤掉大部分数据,再应用`ROWNUM`进行分页,...

    网站内容抓取

    【网站内容抓取】是指利用特定的软件工具从互联网上自动化收集、整理并存储所需信息的过程。这种技术常被用于数据分析、市场研究、新闻监测、竞争对手分析等多种场景。"益众网站信息抓取工具"(WebSpider)是一款跨...

    JQuery+Ajax实现数据查询、排序和分页功能

    JQuery+Ajax实现数据查询、排序和分页功能涉及的知识点主要包括以下几个方面: 1. JQuery和Ajax的基本概念和作用: - JQuery是一个快速、小巧、功能丰富的JavaScript库,它简化了HTML文档遍历、事件处理、动画和...

    用户管理(增删改查,分页显示)

    本项目聚焦于实现“用户管理(增删改查,分页显示)”,这涉及到几个关键的技术点。 首先,"增删改查"(CRUD,Create, Read, Update, Delete)是数据库操作的基础,也是任何数据管理系统的基石。创建用户通常涉及...

    Mybatis拦截器介绍及分页插件.pdf

    例如,如果Mybatis提供的`Executor`接口的几种实现(如`BatchExecutor`、`ReuseExecutor`、`SimpleExecutor`和`CachingExecutor`)都无法满足特定需求,那么可以通过创建拦截器来扩展或替换这些默认行为,而不是直接...

    Ajax实现搜索功能的分页

    首先,我们需要了解几个关键点,它们分别是Ajax技术、搜索功能以及分页处理。 Ajax(Asynchronous JavaScript and XML),即异步JavaScript和XML技术。它是一种实现动态网页内容更新的Web技术,其核心是使用...

    使用Nodejs多进程分页爬虫.zip

    爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...

    页面置换 选择一种或几种页面置换算法进行编程以实现该算法。

    本实验旨在让学生深入理解页面置换策略,并通过编程实现常见的几种算法。 实验涉及的主要知识点包括: 1. **内存分页管理**:内存被划分为固定大小的页,以提高管理效率。每个进程的逻辑地址空间被分割为若干页面...

    JSP实现添加功能和分页显示实例分析

    本文主要通过实例分析,讲解了如何基于MVC框架在JSP中实现添加用户信息的功能以及如何实现分页显示数据。 ### MVC设计模式 MVC模式,全称Model-View-Controller模式,是一种广泛应用于软件工程中的设计模式。在Web...

    JSP实现购物车流程,历史记录分页技术,物品动态分布!

    在IT行业中,Web开发是至关重要的领域,而JavaServer Pages(JSP)是其中一种流行的服务器端脚本语言,常用于构建动态网站和电子商务应用。本项目“JSP实现购物车流程,历史记录分页技术,物品动态分布!”旨在演示...

Global site tag (gtag.js) - Google Analytics