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

SQL Server 存储过程的分页方案比拼

阅读更多

转自: 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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics