`
elvishehai
  • 浏览: 74869 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在SQL Server中通过SQL语句实现分页查询

阅读更多
在SQL Server中通过SQL语句实现分页查询

一下文章为转载:
建立表:

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、使用Top和Not IN:

select Top 20* from TestTable where ID Not In(select Top 200 ID from TestTable Order By ID) Order By ID



2、利用ID大于多少和Select Top分页:

select Top 20 * from TestTable where ID>( select max(id) from (select top 200 id from testTable order by id) as t) order by ID



3、利用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分页),执行时间11秒
分页方案一:(利用Not In和SELECT TOP分页) ,执行时间1秒
分页方案三:(利用SQL的游标存储过程分页) ,执行时间不到1秒

分享到:
评论

相关推荐

    sqlserver分页查询语句

    sqlserver分页查询语句;sqlserver分页查询语句;sqlserver分页查询语句;

    关于SQL Server SQL语句查询分页数据的解决方案

    针对这一需求,本文将详细介绍如何在SQL Server中实现有效的分页查询。 ### 方法1:使用NOT IN 这种方法通过先选择前300100条记录的序列号(这里假设`fldserialNo`是唯一标识每一行的字段),然后在外层查询中排除...

    SqlServer数据库中的分页语句

    在SQL Server中,通常使用`TOP`关键字结合子查询来实现分页。 一个典型的分页查询语句结构如下: ```sql SELECT * FROM ( SELECT TOP pagesize * FROM ( SELECT TOP pagesize*cureentpage * FROM user_...

    sqlserver+group by分组查询分页存储过程

    3. **执行分页查询**:使用动态生成的SQL语句执行查询,并通过设置`ROWCOUNT`来限制返回的结果集大小。 ### 综合运用`GROUP BY`、存储过程和分页技术 在给定的存储过程中,`GROUP BY`子句与分页查询的结合使用提供...

    java 连接sqlserver数据库查询,并分页显示

    在Java编程中,连接SQL Server数据库并执行查询是常见的任务,尤其当涉及到大量数据时,分页显示就显得尤为重要。本篇文章将详细讲解如何使用Java连接SQL Server数据库,执行查询语句以及实现分页显示。 首先,我们...

    java语言的分页查询功能(mysql和sql server)

    在Java编程中,分页查询是一项非常重要的功能,特别是在处理大量数据时,它能有效地减少内存负担,提高应用性能。...无论是在MySQL还是SQL Server中,正确地实现分页都能显著提升应用性能和用户体验。

    sql server 2008通用分页

    SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。

    sqlserver 实现分页的前台代码 以及后台的sqlserver语句

    在SQL Server中,实现分页查询是数据库应用中常见的需求,尤其在大数据量的展示时,分页可以提高用户体验并优化服务器性能。本教程将详细讲解如何在前端使用Java(假设Test.jsp为JSP页面)和后端使用SQL Server语句...

    sql分页 sqlserver中存储过程分页

    通过上述分析可以看出,这个存储过程通过动态生成 SQL 语句的方式实现了较为灵活且高效的分页查询。这种实现方式不仅适用于 SQL Server,也可以为其他关系型数据库设计分页查询提供一定的参考价值。对于实际项目开发...

    用SQL语句实现分页(Oracle版Sql Server版)

    无论是Oracle还是SQL Server,在实现分页查询时都有一些特定的技巧和方法。尽管两者在具体实现细节上有差异,但核心思想是相同的:通过限制查询结果集的范围来实现分页功能。这些技术对于提高Web应用程序的性能至关...

    数据库分页SQL语句实现

    本文将详细介绍三种主流数据库(SQL Server、MySQL和Oracle)中的分页SQL语句实现方法。 #### SQL Server 的分页SQL语句实现 SQL Server 支持通过`TOP`关键字来实现分页查询。具体实现方式如下: 1. **查询第M页...

    SQL Server2005分页查询

    在SQL Server 2005中,分页查询是一个常见的需求,特别是在处理大量数据时,为了提高用户体验,通常需要一次性加载一定数量的数据,而不是一次性显示所有数据。以下将详细讲解SQL Server 2005中分页查询的常用方法。...

    sql server 分页大全

    总结,SQL Server 2000虽然没有内置的分页机制,但通过存储过程和TSQL语句的组合,依然可以实现高效的分页查询。理解并熟练运用这些技术,能帮助我们更好地管理和展示大量的数据库数据。在实际应用中,应根据具体...

    通用的存储过程sql分页查询语句

    存储过程是一组预先编译好的SQL语句,存储在数据库服务器中,可以按需调用执行。它的优点包括提高性能、减少网络流量、增强安全性以及简化复杂的操作。在分页查询场景下,创建一个存储过程可以有效地封装分页逻辑,...

    最简单的SQL Server数据库存储过程分页

    在SQL Server中,通过存储过程实现分页是一种常见且高效的解决方案。其核心思想是利用游标(Cursor)或临时表来获取数据总量,并根据指定的页码和每页数量来计算出需要返回的具体记录范围。这种方法的优势在于它可以...

    SQLServer数据库分页查询

    本文主要探讨在 SQL Server 2008 R2 版本中实现分页查询的五种不同方法,并对这些方法进行了性能测试。 #### 二、测试环境与条件 - **数据库**: SQL Server 2008 R2 - **表名**: ARTICLE - **字段**: ID (主键,...

    SSH框架+SQLServer实现分页的小项目

    分页查询通常需要编写SQL语句,利用`TOP`(在SQLServer中)或其他类似关键字来限制返回的记录数,配合`ORDER BY`进行排序。 **分页实现** 在SSH框架下实现分页,通常会涉及到以下几个步骤: 1. **前端页面**:...

Global site tag (gtag.js) - Google Analytics