[SQL Server] ROW_NUMBERによるページング(Paging)

inno
2014-02-05 10:38 3296 0
[SQL Server] ROW_NUMBERによるページング(Paging)

ROW_NUMBERを利用すると、簡単にページング(Paging)ができます。
テストの為にSQLを準備しました。
まず、テーブルとデータを作成しましょう。

-- テーブル作成
CREATE TABLE dbo.TempPaging
(
Idx int,
StrVal varchar(10)
)
GO

-- データ登録
INSERT INTO dbo.TempPaging (Idx, StrVal)
SELECT 1, 'E' UNION ALL
SELECT 2, 'G' UNION ALL
SELECT 3, 'H' UNION ALL
SELECT 4, 'A' UNION ALL
SELECT 5, 'J' UNION ALL
SELECT 6, 'C' UNION ALL
SELECT 7, 'B' UNION ALL
SELECT 8, 'D' UNION ALL
SELECT 9, 'I' UNION ALL
SELECT 10, 'F' 
GO

では、「StrVal」カラムのデータを基準にしてページング(Paging)をしてみましょう。

-- #### ページング(Paging)テスト #### START ####

DECLARE @Page int
DECLARE @ListSize int

SET @Page = 1 -- 移動するページ番号
SET @ListSize = 2 -- ページごとに表示する件数

DECLARE @StartSn int
SET @StartSn = ((@Page-1) * @ListSize)

SELECT Idx, StrVal FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY StrVal ASC) AS Sn, Idx, StrVal
FROM dbo.TempPaging 
) AS A
WHERE A.Sn BETWEEN @StartSn+1 AND @StartSn+@ListSize

-- #### ページング(Paging)テスト #### END ####

1ページに2件ずつ表示するSQLです。
ですので、1ページ目は「A」、「B」が表示されます。
2ページ目は「C」、「D」が表示されます。
3ページ目は「E」、「F」が表示されます。

簡単でしょう?
ですが、このROW_NUMBER関数を利用したページング(Paging)には注意が必要です。
ROW_NUMBER関数は順位付け関数です。
データを順位で並べるためには全データを検索しないといけません。
つまり、データ量が多ければ多いほど実行速度は遅くなります。
件数が少ない場合はページング(Paging)作業に最適だと思います。

コメント