三種分頁方式效率的簡單測試

  只是做了更大數據量、不同位置頁的對比。

  建立表:

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

  插入數據:(100萬條)

SET IDENTITY_INSERT TestTable ON  declare @i int  set @i=1  while @i<=1000000  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 TOP分頁)

  語句形式:

SELECT TOP 頁大小 *  FROM TestTable  WHERE (ID NOT IN            (SELECT TOP 頁大小*頁數 id           FROM 表           ORDER BY id))  ORDER BY ID

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

SELECT TOP 頁大小 *  FROM TestTable  WHERE (ID >            (SELECT MAX(id)           FROM (SELECT TOP 頁大小*頁數 id                   FROM 表                   ORDER BY id) AS T))  ORDER BY ID

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

create  procedure XiaoZhengGe  @sqlstr nvarchar(4000), --查詢字符串  @currentpage int, --第N頁  @pagesize int --每頁行數  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 總頁數--,@rowcount as 總行數,@currentpage as 當前頁   set @currentpage=(@currentpage-1)*@pagesize+1  exec sp_cursorfetch @P1,16,@currentpage,@pagesize   exec sp_cursorclose @P1  set nocount off

  測試結果:

  測試均為每頁10條,三個數字依次為三種方案出結果需要的時間,單位為秒:

  第2頁:18,10,29

  第500頁:12,8,21

  第50000頁:16,18,22

  第500000頁:24,16,22

  這次測試的主要目的是對大數據量不同部分的翻頁效率的測試。本以為應該是一個線性的結果,結果發現變化很奇怪。多測試幾次結果誤差在1、2秒之內,估計sql server對于翻頁也是根據不同位置有優化的。看了查詢分析,主要的花銷還是order by,這還是主鍵的,如果不是主鍵,或者是字符串,估計更慢。

  因為還有別的事情要忙,也沒有做進一步的測試,有興趣的朋友可以繼續做做10萬條、無索引、字符串內容的各種測試,記得告訴我一下結果。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享