SQL SERVER 2008の3つのページング方法と比較

2908 ワード

テーブルの作成:
 
  
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

:(2 , )
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

ページングスキーム1:(Not InとSELECT TOPを用いてページング)
文の形式:
 
  
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP 20 id
         FROM TestTable
         ORDER BY id))
ORDER BY ID

SELECT TOP *
FROM TestTable
WHERE (ID NOT IN
          (SELECT TOP * id
         FROM
         ORDER BY id))
ORDER BY ID


ページングスキーム2:(IDがどれだけ大きいかとSELECT TOPページングを利用する)文形式:
 
  
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP 20 id
                 FROM TestTable
                 ORDER BY id) AS T))
ORDER BY ID

SELECT TOP *
FROM TestTable
WHERE (ID >
          (SELECT MAX(id)
         FROM (SELECT TOP * id
                 FROM
                 ORDER BY id) AS T))
ORDER BY ID


ページングスキーム3:(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

その他のシナリオ:プライマリ・キーがない場合は、テンポラリ・テーブル、シナリオ3で作成できますが、効率が低下します.最適化を推奨する場合は、プライマリ・キーとインデックスを追加すると、クエリーの効率が向上します.SQLクエリアナライザを通じて、比較を表示します:私の結論は:ページ分けの方案の2:(IDを利用してどれだけとSELECT TOPのページ分けを大きくします)の効率が最も高くて、SQL文のページ分けの方案をつなぎ合わせる必要があります1:(Not InとSELECT TOPのページ分けを利用します)の効率の次、SQL文のページ分けの方案をつなぎ合わせる必要があります3:(SQLのカーソルを利用して過程のページ分けを記憶します)の効率が最も悪くて、しかし、最も一般的なのは実際の状況では、具体的に分析しなければならない.