Каковы различия между старым row_number() и новым разбиением на страницы OFFSET + FETCH на SQL Server?

У меня мало вопросов в контексте более старого row_number (SQL Server 2008) и нового механизма подкачки OFFSET + FETCH (SQL Server 2012), предоставляемого SQL Server 2012.

  • Каковы ограничения с row_number()?
  • Является ли OFFSET + FETCH улучшенной заменой для row_number()?
  • Есть ли какие-либо варианты использования, которых можно было бы использовать только один, а не другой?
  • Существуют ли различия в производительности между этими двумя? Если да, то какой из них рекомендуется?

Спасибо.

Ответы

Ответ 1

Использование ROW_NUMBER() отлично работает - это просто больше работы, чем необходимо; вам нужно написать CTE "скелет" вокруг вашего фактического запроса, добавить столбец ROW_NUMBER() в свой выходной набор, а затем отфильтровать его.

Использование нового OFFSET / FETCH проще - и да, это также лучше для производительности, поскольку эти две ссылки могут показать вам:

Итак, в общем: если вы используете SQL Server 2012 - тогда вы обязательно должны использовать OFFSET/FETCH, а не ROW_NUMBER() для подкачки

Ответ 2

в соответствии с этой статьей 3 метод сопоставления поискового вызова и результат в диаграмме полезен для выбора метода подкачки

Sql Server 2012 Методы пейджинга

весь метод подкачки в количестве мелкой записи работает нормально, но когда растет количество записей после разницы, то методы смены по-разному выглядят напрямую