2009年11月6日金曜日

SQL Server (Transact-SQL)で LIMIT OFFSETする方法 その2 temdb篇

ユーザーが複数のページを繰り返し要求する可能性がある場合に効率的なページ切り替えを行うには、まずベース テーブルのすべての行を、計算した行番号と共に一時テーブルに格納して、その行番号を含む列にインデックスを設定します。

SELECT ROW_NUMBER() OVER(ORDER BY score DESC, speaker) AS rownum, *  INTO #SpeakerStatsRN  FROM SpeakerStats  CREATE UNIQUE CLUSTERED INDEX idx_uc_rownum ON #SpeakerStatsRN(rownum)  

次に、要求された各ページに対し、次のクエリを実行します。

SELECT rownum, speaker, track, score  FROM #SpeakerStatsRN  WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize  ORDER BY score DESC, speaker  

該当するページに含まれる行だけがスキャンされます。

INSERT INTO ... SELECT ... じゃなくて、SELECT ... INTO ... FROM ... なんてあるんだ

via ひひーん!

0 件のコメント:

ブログ アーカイブ

カテゴリー