111

だから、私のウェブサイトにページングを実装したいレコードの数を返す関数があります。これを実現するには、SQL Server 2012 の Offset/Fetch Next を使用するように提案されました。当社の Web サイトには、レコードの総数と、その時点でどのページを表示しているかを一覧表示するエリアがあります。

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

4

4 に答える 4

157

COUNT( ) OVER() メソッドを使用すると、パフォーマンスの問題が発生しました。(10 レコードを返すのに 40 秒かかり、その後は問題が発生しなかったため、サーバーが原因かどうかはわかりません。) この手法は、COUNT( ) OVER() を使用する必要なく、すべての条件下で機能し、同じこと:

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

WITH TempResult AS(
    SELECT ID, Name
    FROM Table
), TempCount AS (
    SELECT COUNT(*) AS MaxRows FROM TempResult
)
SELECT *
FROM TempResult, TempCount
ORDER BY TempResult.Name
    OFFSET (@PageNum-1)*@PageSize ROWS
    FETCH NEXT @PageSize ROWS ONLY
于 2013-11-21T19:37:01.723 に答える
129

あなたが使用することができます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;

ただし、これは小さなデータ セット用に予約する必要があります。大規模なセットでは、パフォーマンスが最悪になる可能性があります。インデックス付きビューの維持 (結果がフィルター処理されていない場合、または句が事前にわかっている場合にのみ機能します) やトリックの使用など、より優れた代替手段については、この Paul White の記事を参照してください。WHEREROW_NUMBER()

于 2012-09-18T03:42:56.300 に答える
1

James Mobergの回答に基づく:

Row_Number()これは、 SQL Server 2012 がなく、OFFSET を使用できない場合の代替手段です。

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

WITH TempResult AS(
    SELECT ID, NAME
    FROM Tabla
), TempCount AS (
    SELECT COUNT(*) AS MaxRows FROM TempResult
)

select * 
from
(
    SELECT
     ROW_NUMBER() OVER ( ORDER BY PolizaId DESC) AS 'NumeroRenglon', 
     MaxRows, 
     ID,
     Name
    FROM TempResult, TempCount

)resultados
WHERE   NumeroRenglon >= @PageNum
    AND NumeroRenglon <= @PageNumEnd
ORDER BY NumeroRenglon
于 2016-04-27T23:11:22.857 に答える