SQL Server 2008と次のクエリを使用して、JSFアプリケーションからページングされたデータを取得します。コードはです。を一度に検索します。DESC順のデフォルトソート列。SQL Server 2008ページロー検索とラージテーブル
SELECT * FROM
(
SELECT TOP 25 * FROM
(
SELECT TOP 25 ...... WHERE CONDITIONS
--ORDER BY ... DESC
)AS INNERQUERY ORDER BY INNERQUERY.... ASC
)
AS OUTERQUERY
ORDER BY OUTERQUERY.... DESC
これは機能しますが、明白な流れが1つあります。ユーザーが最後のページを見るために要求し、1000万人以上のレコードをがテーブルに存在する場合、second TOP Query
は最初retrieve the 10 million
レコードを持つことになりますだけにしfirst top Query
は次のようになりますTop 25
選び出します:
SELECT * FROM
(
SELECT TOP 25 * FROM
(
SELECT TOP 10000000 ...... WHERE CONDITIONS
--ORDER BY ... DESC
)AS INNERQUERY ORDER BY INNERQUERY.... ASC
)
AS OUTERQUERY
ORDER BY OUTERQUERY.... DESC
私は上記のROW_NUMBER OVER(....)を置き換えたように見えましたが、一見二番目のTOPステートメントが全体の結果を得なければならない同じ問題があったので、where ROW_NUMBER between x and y
を実行できます。
上記のアプローチで私の間違いを指摘し、最適化の方法についてのヒントを教えてください。私は現在行のサブセットを取得するには、コードに次を使用してい
ここに便利な行番号の例があります:http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx –
リンクをありがとう、私は見ていましたがあなたは自分自身を見ることができます。最初のSELECT文はすべての行を取得し、2回目のSELECTでは 'xとyの間で '範囲を選択します。私の問題は、最初のSelectステートメントが大量のレコードのために返されるまでに時間がかかることです。 – ke3pup
このSOのリンクと、Greg Hamiltonの記事「大きな結果セットでページングするためのより効率的な方法」の参照を参照してください。http://stackoverflow.com/questions/2308220/is-there-any-performance-issue- using-row-number-to-implement-table-paging-in-sql –