转自: http://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx
1SQLServer存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点
2建立表:
3
4CREATETABLE[TestTable](
5[ID][int]IDENTITY(1,1)NOTNULL,
6[FirstName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL,
7[LastName][nvarchar](100)COLLATEChinese_PRC_CI_ASNULL,
8[Country][nvarchar](50)COLLATEChinese_PRC_CI_ASNULL,
9[Note][nvarchar](2000)COLLATEChinese_PRC_CI_ASNULL
10)ON[PRIMARY]
11GO
12
13
14
15插入数据:(2万条,用更多的数据测试会明显一些)
16SETIDENTITY_INSERTTestTableON
17
18declare@iint
19set@i=1
20while@i<=20000
21begin
22insertintoTestTable([id],FirstName,LastName,Country,Note)values(@i,'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
23set@i=@i+1
24end
25
26SETIDENTITY_INSERTTestTableOFF
27
28
29
30-------------------------------------
31
32分页方案一:(利用NotIn和SELECTTOP分页)
33语句形式:
34SELECTTOP10*
35FROMTestTable
36WHERE(IDNOTIN
37(SELECTTOP20id
38FROMTestTable
39ORDERBYid))
40ORDERBYID
41
42
43SELECTTOP页大小*
44FROMTestTable
45WHERE(IDNOTIN
46(SELECTTOP页大小*页数id
47FROM表
48ORDERBYid))
49ORDERBYID
50
51-------------------------------------
52
53分页方案二:(利用ID大于多少和SELECTTOP分页)
54语句形式:
55SELECTTOP10*
56FROMTestTable
57WHERE(ID>
58(SELECTMAX(id)
59FROM(SELECTTOP20id
60FROMTestTable
61ORDERBYid)AST))
62ORDERBYID
63
64
65SELECTTOP页大小*
66FROMTestTable
67WHERE(ID>
68(SELECTMAX(id)
69FROM(SELECTTOP页大小*页数id
70FROM表
71ORDERBYid)AST))
72ORDERBYID
73
74
75-------------------------------------
76
77分页方案三:(利用SQL的游标存储过程分页)
78createprocedureXiaoZhengGe
79@sqlstrnvarchar(4000),--查询字符串
80@currentpageint,--第N页
81@pagesizeint--每页行数
82as
83setnocounton
84declare@P1int,--P1是游标的id
85@rowcountint
86execsp_cursoropen@P1output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcountoutput
87selectceiling(1.0*@rowcount/@pagesize)as总页数--,@rowcountas总行数,@currentpageas当前页
88set@currentpage=(@currentpage-1)*@pagesize+1
89execsp_cursorfetch@P1,16,@currentpage,@pagesize
90execsp_cursorclose@P1
91setnocountoff
92
93其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
94建议优化的时候,加上主键和索引,查询效率会提高。
95
96通过SQL查询分析器,显示比较:我的结论是:
97分页方案二:(利用ID大于多少和SELECTTOP分页)效率最高,需要拼接SQL语句
98分页方案一:(利用NotIn和SELECTTOP分页)效率次之,需要拼接SQL语句
99分页方案三:(利用SQL的游标存储过程分页)效率最差,但是最为通用
100
101在实际情况中,要具体分析。
更多的讨论见:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515
转自: http://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx
分享到:
相关推荐
sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程 sql Server 通用分页存储过程
SQL Server 存储过程的分页方案比拼.doc
SQL Server 分页方案比拼
想在存储过程中分页的朋友可以使用, sqlserver存储过程万能分页
sqlserver 存储过程分页(支持千万级)算法研究
sqlserver 存储过程分页
SqlServer存储过程的导出导入 近日在研究SQL的存储过程,这里我陆续将我在使用存储过程中碰到的问题及解决办法发布到网上,请各位大虾指正。 SqlServer存储过程的导出导入,网上相关资料特别少,经过摸索,这里写...
利用SQL游标存储过程分页方案,以前用过,应该还行
C#+Sql Server 存储过程分页代码
sqlserver+group by分组查询分页存储过程
SQLSERVER存储过程分页数据查询,完整的数据库代码。
主要介绍了SQLServer存储过程中事务的使用方法,简短的代码带大家更好的学习使用SQLServer存储过程中事务,感兴趣的小伙伴们可以参考一下
SQL server2008中通用分页存储过程,表名,每页长度,页码都是动态赋值。
SQLserver存储过程异常处理
通用的Sql Server分页程序,并且符合BootStrap Table 的调用标准.
1.只需要提供Sql语句和每页的记录数,页数就可以了 2,速度超快哟,100W记录1~3秒就分出来了 3,对于存储过程特别好用
详细介绍了SqlServer的存储过程调试方法,适合初学者及想深入研究的开发人员
执行Sqlserver存储过程返回DataSet
文档记录了SQL Server在存储运用时的语法,需要有一定的SQL语言学习基本,本文档只是做了梳理与总结,以便查看和识记。