1. ホーム
  2. performance

[解決済み] OFFSET / FETCH NEXTからの総行数取得

2022-10-15 03:48:36

質問

私の Web サイトでページングを実装したいレコードの数を返す関数があります。 これを達成するために、SQL Server 2012 のオフセット/フェッチ ネストを使用することを提案されました。 ウェブサイトでは、レコードの総数と、その時点でどのページにいるのかをリストするエリアを設けています。

以前は、レコードセット全体を取得し、それに基づいてプログラム的にページングを構築することができました。 しかし、FETCH NEXT X ROWS ONLY の SQL 方法を使用すると、X 行しか返されないので、レコード セットの合計が何であるか、最小および最大ページをどのように計算するかがわかりません。 私が知っている唯一の方法は、関数を2回呼び出し、1回目で行のカウントを行い、2回目をFETCH NEXTで実行することです。 私がクエリを2回実行する必要がないより良い方法はありますか? 私はパフォーマンスを遅くするのではなく、スピードアップしようとしています。

どのように解決するのですか?

この場合 COUNT(*) OVER() ... ここでは、簡単な例を示します。 sys.all_objects :

DECLARE 
  @PageSize INT = 10, 
  @PageNum  INT = 1;

SELECT 
  name, object_id, 
  overall_count = COUNT(*) OVER()
FROM sys.all_objects
ORDER BY name
  OFFSET (@PageNum-1)*@PageSize ROWS
  FETCH NEXT @PageSize ROWS ONLY;

しかし、これは小規模なデータセットに限ったことであり、大規模なデータセットでは、パフォーマンスが極端に低下する可能性があります。 より良い代替品については、このポール・ホワイトの記事を参照してください。 インデックス付きビューの維持も含めて(これは結果がフィルタリングされていない場合か、あるいは WHERE 節をあらかじめ用意しておき、それを使って ROW_NUMBER() トリック