Обратите внимание, что план запросов решения Radu D показывает двойные попадания в эти таблицы.Он делает два исполнения под прикрытием.Тем не менее, это все еще может быть лучшим способом, так как я не нашел действительно масштабируемый дизайн 1-запроса.
Менее масштабируемый дизайн 1-запроса - выгрузить заполненный упорядоченный список в @tablevariable, SELECT @@ROWCOUNT, чтобы получить полный счет, и выберите из @tablevariable, где номер строки находится между X и Y. Это хорошо работает для <10000 строк, но с результатами в миллионах строк, заполнение этой @tablevariable становится дорогим.</p>
Гибридный подход заключается в заполнении этой переменной / переменной до 10000 строк.Если не все 10000 строк заполнены, значит, все готово.Если заполнено 10000 строк, вам нужно перезапустить поиск, чтобы получить полный счет.Это хорошо работает, если большинство ваших запросов возвращают менее 10000 строк.Предел 10000 - это грубое приближение, вы можете поиграть с этим порогом для своего случая.