私は別の答えに基づいて以下の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
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
現在、これをテストすることはできませんが、一見すると、次のように乗算(クロス結合)を指定していることに気付きました。
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