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