轉自: HTTP://blog.csdn.net/lihonggen0/archive/2004/09/14/103511.aspx
 
1SQL Server 預存程序的分頁,這個問題已經討論過幾年了,很多朋友在問我,所以在此發表一下我的觀點
2建立表:
3
4CREATE TABLE [TestTable] (
5 [ID] [int] IDENTITY (1, 1) NOT Null ,
6 [FirstName] [Nvarchar] (100) COLLATE Chinese_PRC_CI_AS Null ,
7 [LastName] [Nvarchar] (100) COLLATE Chinese_PRC_CI_AS Null ,
8 [Country] [Nvarchar] (50) COLLATE Chinese_PRC_CI_AS Null ,
9 [Note] [Nvarchar] (2000) COLLATE Chinese_PRC_CI_AS Null
10) ON [PRIMARY]
11GO
12
13
14
15插入資料:(2萬條,用更多的資料測試會明顯一些)
16SET IDENTITY_INSERT TestTable ON
17
18declare @i int
19set @i=1
20while @i<=20000
21begin
22 insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
23 set @i=@i+1
24end
25
26SET IDENTITY_INSERT TestTable OFF
27
28
29
30-------------------------------------
31
32分頁方案一:(利用Not In和SELECT TOP分頁)
33語句形式:
34SELECT TOP 10 *
35FROM TestTable
36WHERE (ID NOT IN
37 (SELECT TOP 20 id
38 FROM TestTable
39 ORDER BY id))
40ORDER BY ID
41
42
43SELECT TOP 頁大小 *
44FROM TestTable
45WHERE (ID NOT IN
46 (SELECT TOP 頁大小*頁數 id
47 FROM 表
48 ORDER BY id))
49ORDER BY ID
50
51-------------------------------------
52
53分頁方案二:(利用ID大於多少和SELECT TOP分頁)
54語句形式:
55SELECT TOP 10 *
56FROM TestTable
57WHERE (ID >
58 (SELECT MAX(id)
59 FROM (SELECT TOP 20 id
60 FROM TestTable
61 ORDER BY id) AS T))
62ORDER BY ID
63
64
65SELECT TOP 頁大小 *
66FROM TestTable
67WHERE (ID >
68 (SELECT MAX(id)
69 FROM (SELECT TOP 頁大小*頁數 id
70 FROM 表
71 ORDER BY id) AS T))
72ORDER BY ID
73
74
75-------------------------------------
76
77分頁方案三:(利用SQL的游標預存程序分頁)
78create procedure XiaoZhengGe
79@sqlstr Nvarchar(4000), --查詢字串
80@currentpage int, --第N頁
81@pagesize int --每頁行數
82as
83set nocount on
84declare @P1 int, --P1是游標的id
85 @rowcount int
86exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
87select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 當前頁
88set @currentpage=(@currentpage-1)*@pagesize+1
89exec sp_cursorfetch @P1,16,@currentpage,@pagesize
90exec sp_cursorclose @P1
91set nocount off
93其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
94建議優化的時候,加上主鍵和索引,查詢效率會提高。
95
96通過SQL 查詢分析器,顯示比較:我的結論是:
97分頁方案二:(利用ID大於多少和SELECT TOP分頁)效率最高,需要拼接SQL語句
98分頁方案一:(利用Not In和SELECT TOP分頁) 效率次之,需要拼接SQL語句
99分頁方案三:(利用SQL的游標預存程序分頁) 效率最差,但是最為通用
100
101在實際情況中,要具體分析。
 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()