博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]SQL Server 存储过程的分页方案比拼
阅读量:6260 次
发布时间:2019-06-22

本文共 2522 字,大约阅读时间需要 8 分钟。

 
  1
None.gif
SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点
  2
None.gif建立表:
  3
None.gif
  4
None.gif
CREATE
 
TABLE
 
[
TestTable
]
 (
  5
None.gif 
[
ID
]
 
[
int
]
 
IDENTITY
 (
1
1
NOT
 
NULL
 ,
  6
None.gif 
[
FirstName
]
 
[
nvarchar
]
 (
100
) COLLATE Chinese_PRC_CI_AS 
NULL
 ,
  7
None.gif 
[
LastName
]
 
[
nvarchar
]
 (
100
) COLLATE Chinese_PRC_CI_AS 
NULL
 ,
  8
None.gif 
[
Country
]
 
[
nvarchar
]
 (
50
) COLLATE Chinese_PRC_CI_AS 
NULL
 ,
  9
None.gif 
[
Note
]
 
[
nvarchar
]
 (
2000
) COLLATE Chinese_PRC_CI_AS 
NULL
 
 10
None.gif
ON
 
[
PRIMARY
]
 11
None.gif 
GO
 12
None.gif 
 13
None.gif  
 14
None.gif 插入数据:(2万条,用更多的数据测试会明显一些)
 15
None.gif 
SET
 
IDENTITY_INSERT
 TestTable 
ON
 16
None.gif 
 17
None.gif 
declare
 
@i
 
int
 18
None.gif 
set
 
@i
=
1
 19
None.gif 
while
 
@i
<=
20000
 20
None.gif 
begin
 21
None.gif     
insert
 
into
 TestTable(
[
id
]
, FirstName, LastName, Country,Note) 
values
(
@i
'
FirstName_XXX
'
,
'
LastName_XXX
'
,
'
Country_XXX
'
,
'
Note_XXX
'
)
 22
None.gif     
set
 
@i
=
@i
+
1
 23
None.gif 
end
 24
None.gif 
 25
None.gif 
SET
 
IDENTITY_INSERT
 TestTable 
OFF
 26
None.gif 
 27
None.gif  
 28
None.gif 
 29
None.gif 
--
-----------------------------------
 30
None.gif
 
 31
None.gif 分页方案一:(利用Not In和SELECT TOP分页)
 32
None.gif 语句形式:
 33
None.gif 
SELECT
 
TOP
 
10
 
*
 34
None.gif 
FROM
 TestTable
 35
None.gif 
WHERE
 (ID 
NOT
 
IN
 36
None.gif           (
SELECT
 
TOP
 
20
 id
 37
None.gif          
FROM
 TestTable
 38
None.gif          
ORDER
 
BY
 id))
 39
None.gif 
ORDER
 
BY
 ID
 40
None.gif 
 41
None.gif 
 42
None.gif 
SELECT
 
TOP
 页大小 
*
 43
None.gif 
FROM
 TestTable
 44
None.gif 
WHERE
 (ID 
NOT
 
IN
 45
None.gif           (
SELECT
 
TOP
 页大小
*
页数 id
 46
None.gif          
FROM
 表
 47
None.gif          
ORDER
 
BY
 id))
 48
None.gif 
ORDER
 
BY
 ID
 49
None.gif 
 50
None.gif 
--
-----------------------------------
 51
None.gif
 
 52
None.gif 分页方案二:(利用ID大于多少和SELECT TOP分页)
 53
None.gif 语句形式:
 54
None.gif 
SELECT
 
TOP
 
10
 
*
 55
None.gif 
FROM
 TestTable
 56
None.gif 
WHERE
 (ID 
>
 57
None.gif           (
SELECT
 
MAX
(id)
 58
None.gif          
FROM
 (
SELECT
 
TOP
 
20
 id
 59
None.gif                  
FROM
 TestTable
 60
None.gif                  
ORDER
 
BY
 id) 
AS
 T))
 61
None.gif 
ORDER
 
BY
 ID
 62
None.gif 
 63
None.gif 
 64
None.gif 
SELECT
 
TOP
 页大小 
*
 65
None.gif 
FROM
 TestTable
 66
None.gif 
WHERE
 (ID 
>
 67
None.gif           (
SELECT
 
MAX
(id)
 68
None.gif          
FROM
 (
SELECT
 
TOP
 页大小
*
页数 id
 69
None.gif                  
FROM
 表
 70
None.gif                  
ORDER
 
BY
 id) 
AS
 T))
 71
None.gif 
ORDER
 
BY
 ID
 72
None.gif 
 73
None.gif 
 74
None.gif 
--
-----------------------------------
 75
None.gif
 
 76
None.gif 分页方案三:(利用SQL的游标存储过程分页)
 77
None.gif 
create
  
procedure
 XiaoZhengGe
 78
None.gif 
@sqlstr
 
nvarchar
(
4000
), 
--
查询字符串
 79
None.gif
 
@currentpage
 
int
--
第N页
 80
None.gif
 
@pagesize
 
int
 
--
每页行数
 81
None.gif
 
as
 82
None.gif 
set
 nocount 
on
 83
None.gif 
declare
 
@P1
 
int
--
P1是游标的id
 84
None.gif
  
@rowcount
 
int
 85
None.gif 
exec
 sp_cursoropen 
@P1
 output,
@sqlstr
,
@scrollopt
=
1
,
@ccopt
=
1
,
@rowcount
=
@rowcount
 output
 86
None.gif 
select
 
ceiling
(
1.0
*
@rowcount
/
@pagesize
as
 总页数
--
,@rowcount as 总行数,@currentpage as 当前页 
 87
None.gif
 
set
 
@currentpage
=
(
@currentpage
-
1
)
*
@pagesize
+
1
 88
None.gif 
exec
 sp_cursorfetch 
@P1
,
16
,
@currentpage
,
@pagesize
 
 89
None.gif 
exec
 sp_cursorclose 
@P1
 90
None.gif 
set
 nocount 
off
 91
None.gif 
 92
None.gif 其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
 93
None.gif 建议优化的时候,加上主键和索引,查询效率会提高。
 94
None.gif 
 95
None.gif 通过SQL 查询分析器,显示比较:我的结论是:
 96
None.gif 分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
 97
None.gif 分页方案一:(利用Not In和SELECT TOP分页)   效率次之,需要拼接SQL语句
 98
None.gif 分页方案三:(利用SQL的游标存储过程分页)    效率最差,但是最为通用
 99
None.gif
100
None.gif在实际情况中,要具体分析。

转载于:https://www.cnblogs.com/Spring/archive/2005/08/27/223997.html

你可能感兴趣的文章
红帽新RHEL 7.1企业版发布
查看>>
Linux中的帮助功能
查看>>
Linux学习笔记——程序包管理之yum
查看>>
SqlServer转换为Mysql的一款工具推荐(mss2sql)
查看>>
go装饰模式,一个屌丝撸管的故事
查看>>
学习设计模式——命令模式
查看>>
【POJ】第一章 C/C++语言概述
查看>>
如何封装自己的js类库
查看>>
项目管理小小知识点总结
查看>>
ASP.NET之Javascript脚本的应用
查看>>
vlan间的互通
查看>>
ldconfig详解
查看>>
VBScript 页面的简单样例
查看>>
用c语言指针实现给整形数组冒泡排序
查看>>
ORA-01075,ORA-09925 Read-only file system问题一例
查看>>
Script:收集介质恢复诊断信息
查看>>
SocketIO 随笔
查看>>
Maven学习三之新建maven项目
查看>>
HTML5本地存储-localStorage如何实现定时存储
查看>>
LAMP之Centos6.5安装配置Apache(二)
查看>>