web-dev-qa-db-ja.com

SQLオフセットの合計行数がIN句で遅い

私は別の答えに基づいて以下のSQLコードを使用しています。ただし、大量のin句を含めると、合計数の取得に時間がかかりすぎます。合計数を削除すると、クエリの所要時間は1秒未満になります。合計行数を取得するより効率的な方法はありますか?私が見た答えは2013 SQLクエリに基づいていました。

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

WITH TempResult AS(
    SELECT ID, Name
    FROM Table
     Where ID in ( 1 ,2 3, 4, 5, 6, 7, 8, 9 ,10)
), TempCount AS (
    SELECT COUNT(*) AS MaxRows FROM TempResult
)
SELECT *
FROM TempResult, 
 TempCount    <----- this is what is slow. Removing this and the query is super fast
ORDER BY TempResult.Name
    OFFSET (@PageNum-1)*@PageSize ROWS
    FETCH NEXT @PageSize ROWS ONLY
7

CTEは非常に優れていますが、連続するCTEが多い(2つあるとは考えられませんが、一般的には多い)ため、パフォーマンスに恐怖が何度もありました。最も単純な方法は、行数を一度計算して変数に割り当てることだと思います。

DECLARE 
    @PageSize INT = 10, 
    @PageNum  INT = 1,
    @MaxRows bigint = (SELECT COUNT(1) FROM Table Where ID in ( 1 ,2 3, 4, 5, 6, 7, 8, 9 ,10));

WITH TempResult AS(
    SELECT ID, Name
    FROM Table
     Where ID in ( 1 ,2 3, 4, 5, 6, 7, 8, 9 ,10)
)
SELECT *
FROM TempResult, 
 @MaxRows TempCount    <----- this is what is slow. Removing this and the query is super fast
ORDER BY TempResult.Name
    OFFSET (@PageNum-1)*@PageSize ROWS
    FETCH NEXT @PageSize ROWS ONLY
0
avb

現在、これをテストすることはできませんが、一見すると、次のように乗算(クロス結合)を指定していることに気付きました。

FROM TempResult, 
 TempCount    <----- this is what is slow. Removing this and the query is super 

問題かもしれません

単に次のように書かれた場合、それはどのように機能しますか:

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

WITH TempResult AS(
    SELECT ID, Name
    FROM Table
     Where ID in ( 1 ,2 3, 4, 5, 6, 7, 8, 9 ,10)
)
SELECT *, (SELECT COUNT(*) FROM TempResult) AS MaxRows
FROM TempResult
ORDER BY TempResult.Name
    OFFSET (@PageNum-1)*@PageSize ROWS
    FETCH NEXT @PageSize ROWS ONLY
0
Najinsky