最初にいくつかの主要なページング メソッドとコア ステートメントを示し、次に結論を直接示します。興味のある読者は、一般的に使用されるいくつかのストアド プロシージャ ページング メソッドに関する次のデータを参照してください。
TopN方式
ID が IN でない TableName から Top(@PageSize) を選択します
(テーブル名から先頭 ((@PageIndex-1)*@PageSize) ID を選択します。 .... order by ... )
ここで .... で注文します ...
一時テーブル
次のようにコードをコピーします。
宣言 @indextable table(id intidentity(1,1),nid int,PostUserName nvarchar(50))
@PageLowerBound int を宣言します
@PageUpperBound int を宣言します
set @PageLowerBound=(@pageindex-1)*@pagesize -- 下限
set @PageUpperBound=@PageLowerBound+@pagesize -- 上限
行数を設定 @PageUpperBound
@indextable(nid,PostUserName) に挿入 select ReplyID,PostUserName from TableName order by ...
select * from TableName p,@indextable t where p.ID=t.nid
t.id>@PageLowerBound および t.id<=@PageUpperBound は t.id 順に並べます
CTE--2005 の新しい構文。一時テーブルに似ていますが、ライフサイクルが少し異なります。ここではその応用例を示します。
cte_temp を使用 -- ゼロ時間テーブルを定義します。 PageIndex は、検索結果のページ番号を保存する計算フィールドです。
As (ceiling((Row_Number() over(order by .... )-1)/@pagesize as int) as PageIndex,* from TableName where....)
select * from cte_temp where pageindex=@pageindex-1;
結論は:
ページ数が 10 ページ未満の場合は、TopN の使用を検討できます。CTE と一時テーブルの時間は、一時テーブルよりも長くなりますが、影響はありません。 tempdb が急増し、IO が増加します。
性能比較
テスト環境: win2003server、Sqlserver2005、ライブラリ サイズ 2,567,245 行、where 句なし、テスト中のページ サイズ 50、変数としてのページ番号
0、3、10、31、100、316、1000、3162... ページを取得します。これは 10 のインデックスです。テスト結果は次のとおりです。
ページ数TopN CTE 一時テーブル(キャッシュあり) 一時テーブル(キャッシュなし)
会社が使用しているストアド プロシージャの CTE の改善
1 3 12 10 101 457 7302
3 15 7 79 5524 464 7191
10 127 5504 88 3801 464 6116
32 588 9672 122 3601 976 7602
100 4680 9738 166 4235 486 7151
316 45271 9764 323 3867 522 7255
1000 ヌル 9806 869 2578 635 8948
3162 ヌル 9822 2485 4110 12460 8210
10000 ヌル 9754 7812 11926 14250 7359
31623 ヌル 9775 18729 33218 15249 7511
100000 ヌル ヌル 31538 55569 17139 6124
データの解釈と分析
一時テーブルは、キャッシュか非キャッシュかの 2 つのタイプに分けられます。CTE の改善は、CTE 一時テーブルに選択される列の数を減らすだけです。Null は、選択されることを意味します。時間を計算できません (時間が長すぎます)。データの単位はミリ秒です。
上記のデータから、最初の 32 ページでは TopN が有利であることがわかりますが、ページ数が増えるとパフォーマンスは急速に低下し、CTE の改善は CTE よりも優れており、平均で約 2 秒の改善が見られます。一時テーブルよりはまだマシですが、一時テーブルによってログ ファイルのサイズが増加し、大量の IO が発生することを考慮すると、現在会社で使用されているストアド プロシージャにも CTE 独自の利点があります。 , ただし、ページ番号が遅くなるとパフォーマンスが低下します。