テーブルを作成します:
CREATE TABLE [TestTable] (
[ID] [int] IDENTITY (1, 1) NOT NULL、
[名] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL 、
[姓] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL 、
[国] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 、
[メモ] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) [プライマリ] オン
GO
挿入データ: (20,000 項目、より多くのデータを使用したテストはより明確になります)
SET IDENTITY_INSERT TestTable ON
宣言 @i int
@i=1 を設定します
while @i<=20000
始める
TestTable([id], FirstName, LastName, Country,Note) に挿入 value(@i, 'FirstName_XXX','LastName_XXX','country_XXX','Note_XXX')
@i=@i+1 を設定します
SET IDENTITY_INSERT TestTable
OFF
---------------------------------------
ページングの解決策 1: (Not In と SELECT TOP を使用する)ページング)
声明フォーム:
トップ 10 を選択*
テストテーブルから
どこに(IDがありません)
(上位 20 個の ID を選択
テストテーブルから
IDで注文))
IDで注文
SELECT TOPページサイズ*
テストテーブルから
どこに(IDがありません)
(SELECT TOP ページ サイズ * ページ番号 ID
テーブルから
IDで注文))
ORDER BY ID
---------------------------------------
ページング スキーム 2: (合計を使用します) ID が SELECT TOP ページングよりどれだけ大きいか)
声明フォーム:
トップ 10 を選択*
テストテーブルから
WHERE (ID >
(SELECT MAX(id)
FROM (上位 20 ID を選択
テストテーブルから
ID) AS T)) で注文
IDで注文
SELECT TOPページサイズ*
テストテーブルから
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP ページ サイズ * ページ番号 ID
テーブルから
ID) AS T)) で注文
IDで注文
--------------------------------------
ページング スキーム 3: (SQL カーソル ストアド プロシージャ ページングの使用) )
プロシージャ XiaoZhengGe を作成する
@sqlstr nvarchar(4000)、--クエリ文字列
@currentpage int, --ページ N
@pagesize int --1 ページあたりの行数
として
ノーカウントをオンに設定する
@P1 int を宣言します。 --P1 はカーソルの ID です
@行数整数
exec sp_cursoropen @P1 出力、@sqlstr、@scrollopt=1、@ccopt=1、@rowcount=@rowcount 出力
合計ページ数としてceiling( 1.0*@rowcount/@pagesize )を選択します--、合計行数として@rowcount、現在のページとして@currentpageを選択します
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
他の解決策: 主キーがない場合は、一時テーブルを使用することも、解決策 3 を使用することもできますが、効率は低くなります。
最適化するときは、主キーとインデックスを追加するとクエリ効率が向上するため、推奨されます。
SQL Query Analyzer を使用して比較を表示します。私の結論は次のとおりです。
ページング スキーム 2: (ページングに [より大きい ID] と SELECT TOP を使用) 最も効率的で、SQL ステートメントを結合する必要があります。 ページング スキーム 1: (ページングに Not In と SELECT TOP を使用) 2 番目に効率的で、SQL ステートメントを結合する必要があります。ページング スキーム 3: (SQL のページング スキームを使用する) カーソル ストアド プロシージャ ページング) は最も効率的ではありませんが、
実際の状況では特定の分析が必要です。