天天看點

[轉]SQL Server 存儲過程的分頁方案比拼

  1

[轉]SQL Server 存儲過程的分頁方案比拼

SQL Server 存儲過程的分頁,這個問題已經讨論過幾年了,很多朋友在問我,是以在此發表一下我的觀點

  2

[轉]SQL Server 存儲過程的分頁方案比拼

建立表:

  3

[轉]SQL Server 存儲過程的分頁方案比拼

  4

[轉]SQL Server 存儲過程的分頁方案比拼

CREATE TABLE [TestTable] (

  5

[轉]SQL Server 存儲過程的分頁方案比拼

 [ID] [int] IDENTITY (1, 1) NOT NULL ,

  6

[轉]SQL Server 存儲過程的分頁方案比拼

 [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

  7

[轉]SQL Server 存儲過程的分頁方案比拼

 [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,

  8

[轉]SQL Server 存儲過程的分頁方案比拼

 [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,

  9

[轉]SQL Server 存儲過程的分頁方案比拼

 [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL 

 10

[轉]SQL Server 存儲過程的分頁方案比拼

) ON [PRIMARY]

 11

[轉]SQL Server 存儲過程的分頁方案比拼

 GO

 12

[轉]SQL Server 存儲過程的分頁方案比拼

 13

[轉]SQL Server 存儲過程的分頁方案比拼

 14

[轉]SQL Server 存儲過程的分頁方案比拼

 插入資料:(2萬條,用更多的資料測試會明顯一些)

 15

[轉]SQL Server 存儲過程的分頁方案比拼

 SET IDENTITY_INSERT TestTable ON

 16

[轉]SQL Server 存儲過程的分頁方案比拼

 17

[轉]SQL Server 存儲過程的分頁方案比拼

 declare @i int

 18

[轉]SQL Server 存儲過程的分頁方案比拼

 set @i=1

 19

[轉]SQL Server 存儲過程的分頁方案比拼

 while @i<=20000

 20

[轉]SQL Server 存儲過程的分頁方案比拼

 begin

 21

[轉]SQL Server 存儲過程的分頁方案比拼

     insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')

 22

[轉]SQL Server 存儲過程的分頁方案比拼

     set @i=@i+1

 23

[轉]SQL Server 存儲過程的分頁方案比拼

 end

 24

[轉]SQL Server 存儲過程的分頁方案比拼

 25

[轉]SQL Server 存儲過程的分頁方案比拼

 SET IDENTITY_INSERT TestTable OFF

 26

[轉]SQL Server 存儲過程的分頁方案比拼

 27

[轉]SQL Server 存儲過程的分頁方案比拼

 28

[轉]SQL Server 存儲過程的分頁方案比拼

 29

[轉]SQL Server 存儲過程的分頁方案比拼

 -------------------------------------

 30

[轉]SQL Server 存儲過程的分頁方案比拼

 31

[轉]SQL Server 存儲過程的分頁方案比拼

 分頁方案一:(利用Not In和SELECT TOP分頁)

 32

[轉]SQL Server 存儲過程的分頁方案比拼

 語句形式:

 33

[轉]SQL Server 存儲過程的分頁方案比拼

 SELECT TOP 10 *

 34

[轉]SQL Server 存儲過程的分頁方案比拼

 FROM TestTable

 35

[轉]SQL Server 存儲過程的分頁方案比拼

 WHERE (ID NOT IN

 36

[轉]SQL Server 存儲過程的分頁方案比拼

           (SELECT TOP 20 id

 37

[轉]SQL Server 存儲過程的分頁方案比拼

          FROM TestTable

 38

[轉]SQL Server 存儲過程的分頁方案比拼

          ORDER BY id))

 39

[轉]SQL Server 存儲過程的分頁方案比拼

 ORDER BY ID

 40

[轉]SQL Server 存儲過程的分頁方案比拼

 41

[轉]SQL Server 存儲過程的分頁方案比拼

 42

[轉]SQL Server 存儲過程的分頁方案比拼

 SELECT TOP 頁大小 *

 43

[轉]SQL Server 存儲過程的分頁方案比拼

 44

[轉]SQL Server 存儲過程的分頁方案比拼

 45

[轉]SQL Server 存儲過程的分頁方案比拼

           (SELECT TOP 頁大小*頁數 id

 46

[轉]SQL Server 存儲過程的分頁方案比拼

          FROM 表

 47

[轉]SQL Server 存儲過程的分頁方案比拼

 48

[轉]SQL Server 存儲過程的分頁方案比拼

 49

[轉]SQL Server 存儲過程的分頁方案比拼

 50

[轉]SQL Server 存儲過程的分頁方案比拼

 51

[轉]SQL Server 存儲過程的分頁方案比拼

 52

[轉]SQL Server 存儲過程的分頁方案比拼

 分頁方案二:(利用ID大于多少和SELECT TOP分頁)

 53

[轉]SQL Server 存儲過程的分頁方案比拼

 54

[轉]SQL Server 存儲過程的分頁方案比拼

 55

[轉]SQL Server 存儲過程的分頁方案比拼

 56

[轉]SQL Server 存儲過程的分頁方案比拼

 WHERE (ID >

 57

[轉]SQL Server 存儲過程的分頁方案比拼

           (SELECT MAX(id)

 58

[轉]SQL Server 存儲過程的分頁方案比拼

          FROM (SELECT TOP 20 id

 59

[轉]SQL Server 存儲過程的分頁方案比拼

                  FROM TestTable

 60

[轉]SQL Server 存儲過程的分頁方案比拼

                  ORDER BY id) AS T))

 61

[轉]SQL Server 存儲過程的分頁方案比拼

 62

[轉]SQL Server 存儲過程的分頁方案比拼

 63

[轉]SQL Server 存儲過程的分頁方案比拼

 64

[轉]SQL Server 存儲過程的分頁方案比拼

 65

[轉]SQL Server 存儲過程的分頁方案比拼

 66

[轉]SQL Server 存儲過程的分頁方案比拼

 67

[轉]SQL Server 存儲過程的分頁方案比拼

 68

[轉]SQL Server 存儲過程的分頁方案比拼

          FROM (SELECT TOP 頁大小*頁數 id

 69

[轉]SQL Server 存儲過程的分頁方案比拼

                  FROM 表

 70

[轉]SQL Server 存儲過程的分頁方案比拼

 71

[轉]SQL Server 存儲過程的分頁方案比拼

 72

[轉]SQL Server 存儲過程的分頁方案比拼

 73

[轉]SQL Server 存儲過程的分頁方案比拼

 74

[轉]SQL Server 存儲過程的分頁方案比拼

 75

[轉]SQL Server 存儲過程的分頁方案比拼

 76

[轉]SQL Server 存儲過程的分頁方案比拼

 分頁方案三:(利用SQL的遊标存儲過程分頁)

 77

[轉]SQL Server 存儲過程的分頁方案比拼

 create  procedure XiaoZhengGe

 78

[轉]SQL Server 存儲過程的分頁方案比拼

 @sqlstr nvarchar(4000), --查詢字元串

 79

[轉]SQL Server 存儲過程的分頁方案比拼

 @currentpage int, --第N頁

 80

[轉]SQL Server 存儲過程的分頁方案比拼

 @pagesize int --每頁行數

 81

[轉]SQL Server 存儲過程的分頁方案比拼

 as

 82

[轉]SQL Server 存儲過程的分頁方案比拼

 set nocount on

 83

[轉]SQL Server 存儲過程的分頁方案比拼

 declare @P1 int, --P1是遊标的id

 84

[轉]SQL Server 存儲過程的分頁方案比拼

  @rowcount int

 85

[轉]SQL Server 存儲過程的分頁方案比拼

 exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output

 86

[轉]SQL Server 存儲過程的分頁方案比拼

 select ceiling(1.0*@rowcount/@pagesize) as 總頁數--,@rowcount as 總行數,@currentpage as 目前頁 

 87

[轉]SQL Server 存儲過程的分頁方案比拼

 set @currentpage=(@currentpage-1)*@pagesize+1

 88

[轉]SQL Server 存儲過程的分頁方案比拼

 exec sp_cursorfetch @P1,16,@currentpage,@pagesize 

 89

[轉]SQL Server 存儲過程的分頁方案比拼

 exec sp_cursorclose @P1

 90

[轉]SQL Server 存儲過程的分頁方案比拼

 set nocount off

 91

[轉]SQL Server 存儲過程的分頁方案比拼

 92

[轉]SQL Server 存儲過程的分頁方案比拼

 其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。

 93

[轉]SQL Server 存儲過程的分頁方案比拼

 建議優化的時候,加上主鍵和索引,查詢效率會提高。

 94

[轉]SQL Server 存儲過程的分頁方案比拼

 95

[轉]SQL Server 存儲過程的分頁方案比拼

 通過SQL 查詢分析器,顯示比較:我的結論是:

 96

[轉]SQL Server 存儲過程的分頁方案比拼

 分頁方案二:(利用ID大于多少和SELECT TOP分頁)效率最高,需要拼接SQL語句

 97

[轉]SQL Server 存儲過程的分頁方案比拼

 分頁方案一:(利用Not In和SELECT TOP分頁)   效率次之,需要拼接SQL語句

 98

[轉]SQL Server 存儲過程的分頁方案比拼

 分頁方案三:(利用SQL的遊标存儲過程分頁)    效率最差,但是最為通用

 99

[轉]SQL Server 存儲過程的分頁方案比拼

100

[轉]SQL Server 存儲過程的分頁方案比拼

在實際情況中,要具體分析。