SQL Server 2005のいくつかのページング方法について簡単に説明します


SQL Serverページングクエリは、私たちがよく使用する機能であり、その実現方法もたくさんあります.本稿のいくつかのページング方法は、『SQL Server 2005パフォーマンスチューニング』から抜粋しています.SQL Serverページングクエリの学習に役立ちます.
次のスクリプトを使用してテストデータを生成します.

  
  
  
  
  1. CREATE TABLE TRANS_TABLE(  
  2.         MYID   INT IDENTITY(1,1) NOT NULL PRIMARY KEY,  
  3.         MYDESC VARCHAR(10),  
  4.         MYDATE DATETIME,  
  5.         MYGROUPID INT)  
  6. DECLARE @I INT 
  7. SET @I = 0WHILE @I < 1000000  
  8. BEGIN 
  9.     INSERT INTO TRANS_TABLE  
  10.     SELECT CHAR(ASCII('A') - 2 + (2 * (1 + ABS(CHECKSUM(NEWID())) % 26))),  
  11.                  DATEADD(dayABS(CHECKSUM(NEWID())) % 365, '01/01/2007'),  
  12.                  (ABS(CHECKSUM(NEWID())) % 10)  
  13.     SET @I = @I + 1  
  14. END 
  15. CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYDATE  
  16. ON TRANS_TABLE(MYDATE)  
  17. CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYGROUPID  
  18. ON TRANS_TABLE(MYGROUPID)  
  19.  

1、CTEによるページング
1)row_を使うnumber()ランキング関数、派生テーブルの方式ページング

  
  
  
  
  1. DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  3. select *  
  4.   from ( select p.*, rownum rnum  
  5.          FROM (  
  6.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, *  
  7.             FROM TRANS_TABLE (NOLOCK)  
  8.                 ) p  
  9.           where rownum <= @START_ROW + @MAX_ROWS - 1  
  10.        )  
  11.  z where rnum >= @START_ROW  
  12.  

2)派生テーブルをCTEで置換

  
  
  
  
  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3. WITH PAGED AS (  
  4.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,     *  
  5.             FROM TRANS_TABLE (NOLOCK)  
  6.             )  
  7. SELECT *  
  8. FROM PAGEDWHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS-1 

3)CTEメソッドでもあるが,テストデータによると,この性能は前の2つよりも優れていることが分かった.

  
  
  
  
  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3. WITH PAGED AS (  
  4.             SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, MYID  
  5.             FROM TRANS_TABLE (NOLOCK)  
  6.             )  
  7. SELECT TT.*  
  8. FROM PAGED PGD  
  9. INNER JOIN TRANS_TABLE TT  
  10. ON PGD.MYID = TT.MYID  
  11. WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1  
  12. ORDER BY MyDate, MYID  

2、ROWに基づくCOUNTのページング

  
  
  
  
  1. DECLARE     @START_ID int, @START_ROW int, @MAX_ROWS int,  
  2.          @START_DATETIME DATETIME, @TOT_ROW_CNT INT 
  3. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  4. -- Get the first row for the page  
  5. SET ROWCOUNT @START_ROW  
  6. SELECT @START_ID = MYID, @START_DATETIME = MYDATE FROM TRANS_TABLE (NOLOCK)  
  7.         ORDER BY MYDATE, MYID  
  8. -- Now, set the row count to MaximumRows and get  
  9. -- all records >= @first_idSET ROWCOUNT @MAX_ROWS  
  10. SELECT *  
  11. FROM TRANS_TABLE (NOLOCK)  
  12. WHERE MYID >= @START_ROW  
  13. AND MYDATE >= @START_DATETIME  
  14. ORDER BY MYDATE, MYID  
  15. SET ROWCOUNT 0  

3、TOP@Xページング
SQL Server 2005では、戻り行数をパラメータとしてtop文に渡すことができる.

  
  
  
  
  1. DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT INT, @START_DESC VARCHAR(10)  
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25  
  3. -- Get the first row for the page  
  4. SELECT TOP(@START_ROW) @START_ID = MYID, @START_DESC = MYDESC FROM TRANS_TABLE (NOLOCK)  
  5.     ORDER BY MYDESC, MYID  
  6. SELECT TOP(@MAX_ROWS) *  
  7. FROM TRANS_TABLE (NOLOCK)  
  8. WHERE MYID >= @START_ROW  
  9. AND MYDESC >= @START_DESC  
  10. ORDER BY MYDESC, MYID  
  11.  

4、Temp表ページング

  
  
  
  
  1. DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int 
  2. SELECT @START_ROW = 1, @MAX_ROWS = 25;  
  3.     SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,  
  4.          MYID  
  5.     into #TEMP 
  6.     FROM TRANS_TABLE (NOLOCK)  
  7. SELECT TT.*  
  8. FROM TRANS_TABLE (NOLOCK) TT  
  9. INNER JOIN #TEMP TON TT.MYID = T.MYID  
  10. WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1  
  11. DROP TABLE #TEMP 
  12.  

以上、今回ご紹介したSQL Server 2005のいくつかのページング方法について説明しましたが、SQL Serverページングクエリーの学習に役立つと思います.