Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 OFFSET, FETCH, пагинация  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
Привет всем!

Насколько я знаю, до 2012 версии в MS SQL Server нельзя было простым «человеческим» методом делать пагинацию (постраничный вывод) результатов (на сайте). В 2012 версии были введены команды offset и fetch next, однако, насколько я читал, то, эти команды не дают особого прироста производительности и, по факту, выполняют любой запрос очень тупо: т.е., вначале выполняется сам запрос (WHERE, JOIN и.т.п.), извлекается куча результатов, от начала списка результатов отсчитывается (OFFSET) указанное количество строк и извлекается количество строк указанное в FETCH NEXT.

Т.е., запрос:

select * from Table where ... offset 50 rows fetch next 25 rows only;


по факту, извлекает все строки подходящие по условие указанное в WHERE, а потом после указанного OFFSET извлекаются 25 строк.

У меня есть сложные запросы с множеством JOIN, которые мне ох как не хочется выполнять при каждом обращении пользователя, который использует на сайте постраничный вывод результатов. Поэтому, я хочу сделать вот, что:

1) Выполняю запрос один раз и сохраняю все результаты в глобальную временную таблицу, клиент получает имя этой временной таблицы для дальнейшего использования.

2) При следующем обращении, клиенту не нужно будет по новой выполнять запрос, а достаточно просто получить результаты из указанной глобальной временной таблицы.

3) По прошествии некоторого времени, — скажем 10 минут НЕ обращения к таблице, временная таблица будет автоматически удалена.

Скажите, кто-либо пытался организовать постраничный вывод таким образом на практике? — есть ли какие слабые стороны?

Спасибо.
13 май 14, 22:37    [16012824]     Ответить | Цитировать Сообщить модератору
 Re: OFFSET, FETCH, пагинация  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2995
roman_lenko, на практике такой метод не применял. Почитайте вот это.
Не совсем по существу вопроса, но ...

roman_lenko
— есть ли какие слабые стороны?

проблема будет с запросами, т.к название таблицы будет меняться
лишняя нагрузка на темпдб
14 май 14, 08:10    [16013458]     Ответить | Цитировать Сообщить модератору
 Re: OFFSET, FETCH, пагинация  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
У меня есть сложные запросы с множеством JOIN

Вероятно, у вас есть проблемы с тем, что AD HOC запросы тратят больше времени на компиляцию, чем на само выполнение.
Попробуйте использовать Руководство планов с шаблоном (template) в таком случае.

Самый простой вариант оценить время компиляции - это выполнить set statistics time on и запустить запрос. В страничке со статистикой увидите время компиляции и выполнения. "Подсмотреть" параметры запроса можно с помощью Profiler.

Offset, по наблюдениям, работает менее эффективно, чем нумерация строк результата (row_number())и выборка диапазона.
14 май 14, 11:22    [16014206]     Ответить | Цитировать Сообщить модератору
 Re: OFFSET, FETCH, пагинация  [new]
roman_lenko
Member

Откуда: Киев
Сообщений: 98
HandKot
roman_lenko, на практике такой метод не применял. Почитайте вот это.


Спасибо — очень хорошая статья — добавил в избранное.

HandKot
проблема будет с запросами, т.к название таблицы будет меняться
лишняя нагрузка на темпдб


Честно говоря, я пока этот вариант не особо прорабатывал — поэтому детали типа «название таблицы будет меняться» не учитывал.

----

Владислав Колосов, спасибо за совет. Копну в эту сторону. Конечно, JOINы можно со временем заменить системой кешированя (статические таблицы), но пока попробую померять компиляцию.
14 май 14, 12:24    [16014697]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить