У меня есть следующий оператор SQL, который генерируется в динамической хранимой процедуре на основе различных параметров:
SELECT [MetadataId], [DocumentType], InvoiceNumber FROM
(
SELECT [MetadataId], [DocumentType], InvoiceNumber, ROW_NUMBER()
OVER (ORDER BY [MetadataId] Asc)
AS [Row_ID]
FROM [Metadata]
WHERE ([DocumentType] = 'Invoice')
) Wrapper
WHERE Row_ID BETWEEN 999980 AND 1000000
, где Row_ID
изменяется в зависимости от текущей страницы моей сетки.
Приведенный выше запрос прекрасно работает, когда я сначала перехожу со страницы 1 на страницу 2,3,4,5 и т. Д., Но я не могу сказать то же самое, если сразу перехожу со страницы 1 на страницу 50 000, то есть последняя страница в моей тестовой базе данных, которая содержит 1 миллион случайно сгенерированных случайным образом счетов с размером моей страницы 20.
Загрузка занимает около 29/30 секунд, а объем оперативной памяти, используемой моим экземпляром SQL Server, увеличивается с 400 МБ до 1,61 ГБ.
По истечении начальной задержки переход к страницам 49999, 49998, 49997 и т. Д. Происходит мгновенно, а перемещение назад и вперед между страницами 1–50000 также мгновенно.
Я могу только предположить, что весь набор данных каким-то образом загружен в память.
Дополнительные примечания:
MetadataId
устанавливается в качестве первичного ключа.
- Другие столбцы с возможностью поиска, такие как
DocumentType
, InvoiceNumber
и т. Д., Также индексируются, но не уникальны.
- Мне нужно продолжать использовать динамическую хранимую процедуру по разным причинам, но главная из них заключается в том, что, хотя требования к полю меняются от клиента к клиенту, результат, используемый нашим приложением, остается неизменным.
- Использование редакции SQL Server 2014 для моих тестов.
Итак, мои вопросы:
Может кто-нибудь объяснить мне, что на самом деле происходит? Все ли данные загружаются в память?
Есть ли способ улучшить это? Обратите внимание, что мне нужно Row_ID
сгенерировать с помощью 'ROW_NUMBER () OVER', так как часть предложения WHERE
в моем операторе SQL может довольно сильно измениться в зависимости от того, под каким параметром ищет пользователь.
Спасибо.
UPDATE-1
Вот план выполнения: