テスト後、14483461 レコードのうち 100000 ページを昇順および降順でページごとに 10 レコードずつクエリすると、1 回目は 0.47 秒、2 回目は 0.43 秒になりました。テスト構文は次のとおりです。
exec GetRecordFromPage news,newsid,10,100000
news はテーブル名、newsid はキーフィールドです。使用するときは最初に newsid にインデックスを付けてください。
次のようにコードをコピーします。
/*
関数名: GetRecordFromPage
機能: 指定したページのデータを取得します。
パラメータの説明: @tblName データを含むテーブル名
@fldName キーフィールド名
@PageSize ページごとのレコード数
@PageIndex 取得するページ番号
@OrderType 並べ替えタイプ、0 - 昇順、1 - 降順
@strWhere クエリ条件 (注: where を追加しないでください)
作者: アイアンフィスト
電子メール: [email protected]
作成時間: 2006-07-04
更新日: 2006-07-04
*/
プロシージャの作成 GetRecordFromPage
@tblName varchar(255), -- テーブル名
@fldName varchar(255), -- フィールド名
@PageSize int = 10, -- ページサイズ
@PageIndex int = 1, -- ページ番号
@OrderType bit = 0, -- 並べ替えタイプを設定します。0 以外の値は降順になります。
@strWhere varchar(2000) = '' -- クエリ条件 (注: where を追加しないでください)
として
@strSQL varchar(6000) を宣言 -- メインステートメント
@strTmp varchar(1000) を宣言 -- 一時変数
@strOrder varchar(500) を宣言 -- ソート型
@OrderType != 0 の場合
始める
set @strTmp = '<(最小値を選択'
set @strOrder = ' [' + @fldName + '] desc で並べ替えます'
終わり
それ以外
始める
set @strTmp = '>(最大値を選択'
set @strOrder = ' [' + @fldName +'] asc で並べ替えます'
終わり
set @strSQL = '先頭を選択' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder
if @strWhere != ''
set @strSQL = '先頭を選択' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) および ' + @strWhere + ' ' + @strOrder
@PageIndex = 1の場合
始める
@strTmp を設定 = ''
if @strWhere != ''
set @strTmp = ' where (' + @strWhere + ')'
set @strSQL = '先頭を選択' + str(@PageSize) + ' * from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
終わり
実行(@strSQL)
行く