Я использовал Row_Number() для реализации поискового вызова в моей хранимой процедуре. Пейджинг работает нормально. Но проблема в том, что после реализации Row_Number() индексы не работают & Кластерный индекс SCAN происходит, даже если я использую столбец первичного ключа по порядку по разделу. ниже приведен пример запроса:индекс не работает при использовании ROW_NUMBER в sql-сервере
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 отображается как «предикат», когда они находятся в некластеризованном индексе.
Пожалуйста, дайте мне несколько советов, чтобы решить мои обе проблемы.
Привет Гордон, представление содержит данные из 4 таблиц и в этих таблицах используется поиск кластеризованного индекса. В моем запросе предложение where содержит фильтр только для базовой таблицы, а моя некластеризованная последовательность индексов: (categoryID, countrycode, createddate, stateID, cityID) включают (название, объявление, условие, цена, измененная дата). AdUid поступает из второй таблицы, которую я использовал в join, и эта таблица имеет кластеризованный индекс и использует поиск индекса. –
@AnujRathi. , , Вы должны иметь 'createddate' в конце списка полей. Он используется для неравенства в предложении 'where'. –
спасибо за ваш совет. У меня также есть googled на другом сайте, я думаю, что это будет хороший вариант. –