SQLServer數(shù)據(jù)庫三種分頁方案詳盡分析

字號:

本文采用三種分頁辦法,最后對三種分頁辦法分析了其優(yōu)缺點。
     建立表:
     CREATE TABLE [TestTable] (
     [ID] [int] IDENTITY (1, 1) NOT NULL ,
     [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
     [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
     [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
     [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
     ) ON [PRIMARY]
     GO
     插入數(shù)據(jù):(2萬條,用更多的數(shù)據(jù)測試會明顯一些)
     SET IDENTITY_INSERT TestTable ON
     declare @i int
     set @i=1
     while @i<=20000
     begin
     insert into TestTable([id], FirstName, LastName, Country,Note)
     values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
     set @i=@i+1
     end
     SET IDENTITY_INSERT TestTable OFF
     分頁方案一:
     (利用Not In和SELECT 分頁)
     語句形式:
     SELECT 10 *
     FROM TestTable
     WHERE (ID NOT IN
     (SELECT 20 id
     FROM TestTable
     ORDER BY id))
     ORDER BY ID
     SELECT 頁大小 *
     FROM TestTable
     WHERE (ID NOT IN
     (SELECT 頁大小*頁數(shù) id
     FROM 表
     ORDER BY id))
     ORDER BY ID
     分頁方案二:
     (利用ID大于多少和SELECT 分頁)
     語句形式:
     SELECT 10 *
     FROM TestTable
     WHERE (ID >
     (SELECT MAX(id)
     FROM (SELECT 20 id
     FROM TestTable
     ORDER BY id) AS T))
     ORDER BY ID
     SELECT 頁大小 *FROM TestTableWHERE (ID >
     (SELECT MAX(id)
     FROM (SELECT 頁大小*頁數(shù) id
     FROM 表
     ORDER BY id) AS T))ORDER BY ID
    分頁方案三:
    (利用SQL的游標存儲過程分頁)
     create procedure XiaoZhengGe
     @sqlstr nvarchar(4000), --查詢字符串
     @currentpage int, --第N頁
     @pagesize int --每頁行數(shù)
     as
     set nocount on
     declare @P1 int, --P1是游標的id
     @rowcount int
     exec sp_cursoropen @P1 output,@sqlstr,
     @scrollopt=1,@ccopt=1,@rowcount=@rowcount output
     select ceiling(1.0*@rowcount/@pagesize)
     as 總頁數(shù)--,@rowcount as 總行數(shù),@currentpage as 當前頁
     set @currentpage=(@currentpage-1)*@pagesize+1
     exec sp_cursorfetch @P1,16,@currentpage,@pagesize
     exec sp_cursorclose @P1
     set nocount off
     其它的方案:如果沒有主鍵,可以用臨時表,也可以用方案三做,但是效率會低。
     建議優(yōu)化的時候,加上主鍵和索引,查詢效率會提高。
     通過SQL 查詢分析器,顯示比較:我的結論是:
     分頁方案二:(利用ID大于多少和SELECT 分頁)效率,需要拼接SQL語句。
     分頁方案一:(利用Not In和SELECT 分頁)效率次之,需要拼接SQL語句。
     分頁方案三:(利用SQL的游標存儲過程分頁)效率最差,但是最為通用。