2012-03-22 14 views
2

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を実行できます。

上記のアプローチで私の間違いを指摘し、最適化の方法についてのヒントを教えてください。私は現在行のサブセットを取得するには、コードに次を使用してい

+0

ここに便利な行番号の例があります:http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx –

+0

リンクをありがとう、私は見ていましたがあなたは自分自身を見ることができます。最初のSELECT文はすべての行を取得し、2回目のSELECTでは 'xとyの間で '範囲を選択します。私の問題は、最初のSelectステートメントが大量のレコードのために返されるまでに時間がかかることです。 – ke3pup

+0

このSOのリンクと、Greg Hamiltonの記事「大きな結果セットでページングするためのより効率的な方法」の参照を参照してください。http://stackoverflow.com/questions/2308220/is-there-any-performance-issue- using-row-number-to-implement-table-paging-in-sql –

答えて

0

WITH PAGED_QRY (
        SELECT *, ROW_NUMVER() OVER(ORDER BY Y) AS ROW_NO 
        FROM TABLE WHERE .... 
       ) 
SELECT * FROM PAGED_QRY WHERE ROW_NO BETWEEN @CURRENT_INDEX and @ ROWS_TO_RETRIEVE 
ORDER BY ROW_NO 

@current_index@rows_to_retrieve(。すなわち150は、あなたのページング変数です。よりクリーンで読みやすい。

私もSET ROW_COUNT @ROWS_TO_RETRIEVEを使ってみましたが、大きな違いはありません。

上記のクエリを使用して、クエリの実行パスを慎重に検討し、インデックスや統計を変更/作成すると、私は十分に満足できる結果に達しました。内側のクエリで必要な行のみを取得するという本来の目的はまだ可能ではないようですが、その方法がわかったら私に教えてください。

0

私たちは上記のクエリをもう少し改善することができます。 私は@current_indexが、我々は、上記のようにクエリを書き直すことができ、現在のページ番号であると仮定した場合:この場合

WITH PAGED_QRY (
       SELECT top (@current_index * @rows_to_retrieve) *, ROW_NUMVER() 
       OVER(ORDER BY Y) AS ROW_NO 
       FROM TABLE WHERE .... 
      ) 
SELECT TOP @ROWS_TO_RETRIEVE FROM PAGED_QRY 
ORDER BY ROW_NO DESC 

、私たちの内側のクエリは、全体のレコードセットを返しません。 page_indexが3 & page_sizeが50であると仮定した場合、テーブルは150行しか選択されません。& where句もスキップできます。

関連する問題