Row_Number() を使用して、ストアド プロシージャにページングを実装しました。ページングは正常に機能しています。しかし問題は、Row_Number() を実装した後、インデックスが機能せず、主キー列をセクションごとに使用してもクラスター化インデックス SCAN が発生することです。以下はサンプルクエリです。
SELECT TOP (@insPageSize) A.RowNum, A.AdID, A.AdTitle, A.AdFor, A.AdCondition,
A.AdExpPrice, A.CreatedDate, A.ModifiedDate, A.AdUID
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY vaa.AdID DESC) AS RowNum,
vaa.AdID, vaa.AdTitle, vaa.CityID, vaa.AdFor, vaa.AdCondition,
vaa.AdExpPrice, vaa.CreatedDate, vaa.ModifiedDate, vaa.AdUID
FROM Catalogue.vwAvailableActiveAds vaa
WHERE vaa.CategoryID = @intCategoryID AND vaa.CountryCode = @chrCountryCode
AND vaa.CreatedDate > DATEADD(dd, -90, GETUTCDATE())
AND vaa.StateID = @inbStateID AND vaa.CityID = @inbCityID
) A
WHERE A.RowNum > (@insPageSize * (@insPageNo - 1))
内部クエリのみを実行しようとすると:
SELECT ROW_NUMBER() OVER (ORDER BY vaa.AdID DESC) AS RowNum,
vaa.AdID, vaa.AdTitle, vaa.CityID, vaa.AdFor, vaa.AdCondition,
vaa.AdExpPrice, vaa.CreatedDate, vaa.ModifiedDate, vaa.AdUID
FROM Catalogue.vwAvailableActiveAds vaa
WHERE vaa.CategoryID = @intCategoryID AND vaa.CountryCode = @chrCountryCode
AND vaa.CreatedDate > DATEADD(dd, -90, GETUTCDATE())
AND vaa.StateID = @inbStateID AND vaa.CityID = @inbCityID
インデックスは使用しません。AdID は主キーであり、すべての where 句をカバーする別の非クラスター化インデックスがあります。ただし、インデックス スキャンは発生します。内部クエリから Row_Number() を削除してその実行プランを確認すると、すべてのインデックスが正常に機能しますが、クラスター化されていないインデックスにある場合は、StateID と CityID が「述語」として表示されます。
両方の問題を解決するためのガイダンスを教えてください。