Причина, по которой ваш запрос медленный, заключается в том, что у вас есть сортировка всей таблицы на каждый запрос.Чтобы значительно ускорить его, вам нужно избегать сортировки большого объема данных по стоимости процессора, жесткого диска / памяти или ограничений по логике разбиения на страницы.
Поскольку информации о том, как сортируется таблица, и если вывставляйте посередине / удаляйте записи очень часто, я сузю ваш вопрос, сделав следующие предположения:
Я думаю, у вас есть таблица с архивом статей.Новые записи в основном находятся внизу таблицы, записи из середины таблицы редко удаляются.
Вы всегда сортируете по одному и тому же столбцу somecolumn
и в том же порядке, напримерпо убыванию.
У вас нет введенных пользователем фильтров (например, заголовок статьи или автор).
Это делает таблицу статической с точки зрениявывод: каждая статья будет на том же месте, если не вставлена новая.Новый пришел на вершину вашего выхода.Затем вы можете сохранить ROW_NUMBER() OVER ()
как столбец.Более удобным решением будет столбец IDENTITY
.Это ускорит процесс, если вы создадите кластеризованный индекс для этого столбца
alter table add [Record_Number] int null IDENTITY
Этот новый столбец добавляется как null
, чтобы вы могли заполнять значения в первый раз.Тогда вы можете сделать это not null
.
С другой стороны, вы можете очень быстро набрать номер строки на
select @Max_Row = SELECT MAX(row_number) from MyTable
Теперь, когда у вас есть общее количество строк, размер страницы и номер страницыВы можете выбрать нужные строки в одном операторе, не сортируя всю партию.
Select * From MyTable
Where row_number between
(@Max_Row - @Page * @Page_Size) + 1 AND
@Max_Row -(@Page - 1) * @Page_Size
Если у вас есть фильтр в CTE, то дайте больше информации о том, как структурированы ваши данные, чтобы мы могли подуматьспособа ограничения области применения CTE.