2013-11-22 2 views
2

У меня есть запрос для выборки записей по номерам страниц, как следовать,Почему мой запрос медленный для получения записей с большим смещением?

SELECT 
    FirstName = R.FirstName, 
    LastName = R.LastName, 
    CountryId = R.CountryID, 
    ...... 
FROM Resource AS R 
WHERE ... 
ORDER BY LastName, FirstName 
OFFSET 10 * (@PageNumber - 1) ROWS 
FETCH NEXT 10 ROWS ONLY 

Общее количество записей составляет более 30,000.

  • Когда @PageNumber = 1, время работы составляет менее 1 секунды, почти сразу.
  • Когда @PageNumber = 500, время работы около 4s.
  • Когда @PageNumber = 1000, время работы меньше 12 секунд.
  • Когда @PageNumber = 2000, время работы составляет менее 20 секунд.
  • Когда @PageNumber = 3000, время работы составляет менее 28 секунд.

Интересно, почему гораздо медленнее извлекать записи с большим смещением, чем меньшие, потому что общее количество выбранных строк одинаково (10). Похоже, что запрос извлекает передние записи намного быстрее, чем те, которые сидят позади. Или что-то не так в запросе?

+1

Вы посмотрели план выполнения? Что он говорит? – peterm

ответ

5

Как утверждает документы Offset Fetch (жирный курсив мой):

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS } 

Указывает количество строк, чтобы пропустить,, прежде чем начать возвращать строки из выражения запроса. Аргумент для предложения OFFSET может быть целым числом или выражением, которое больше или равно нулю. Вы можете использовать ROW и ROWS взаимозаменяемо.

Это означает, что все строки будут извлечены, но пропущены для количества строк, которые вы передаете в качестве аргументов. Так больше строк, больше времени. Просто как тот.

+1

Согласен. Я думаю, что вопросник - это запутанная работа, которую SQL Server должен делать на своем конце, с тем, что отправлено по проводу. Как он мог пропустить результаты N, не выясняя первые результаты N? 'OFFSET', похоже, в том же духе, что и' ORDER BY' - способ сделать легкое форматирование отчета вместо использования «реального» инструмента, такого как SSRS. Если вам нужно какое-то понятие быстрого перехода к N-му элементу какой-то обыденности, вам нужно выяснить способ выразить это в индексе. –

Смежные вопросы