Как эффективно реализовать пейджинг?

9

У меня есть запрос к базе данных, который может привести к большому набору результатов. Клиент, который отображает данные, получает данные по сети, поэтому идея состояла в том, чтобы минимизировать объем передаваемых данных, извлекая только первые 50 результатов из базы данных и отправляя их клиенту. Затем я предоставлю возможность перейти на вторую страницу, чтобы получить следующие 50 результатов и т. Д. (Что-то похожее, что, например, предлагает Google)

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

Есть больше клиентов, которые запрашивают базу данных одновременно. Используемый движок SQL: MS SQL 2005

Мои идеи были:

  • Используйте подготовленные SQL-команды для обеспечения совместного использования плана выполнения.
  • используйте переменную ROW_COUNT, чтобы получить только нужные строки

Но действительно ли это самый эффективный способ? Или вы думаете, что было бы лучше извлечь весь набор результатов и реализовать разбиение на страницы в коде, который отправляет данные клиенту?

Спасибо за ваши советы!

С уважением, Томас

Томас Валек
источник

Ответы:

7

Запрос будет выполняться каждый раз. SQL Server не кэширует результаты.

Правильная подкачка страниц не будет реализована до SQL Server 2011, но до тех пор ваши варианты (как вы определили):

  • ROW_NUMBER () и запросы по запросу
  • кэширование клиента

Подготовленный оператор SQL будет выполняться каждый раз.

Если у вас толстый клиент, то кэширование является локальным для клиента. Это в основном нормально, если у вас нет, например, миллионов капель.

В нашем веб-клиенте мы отображаем все результаты, но показываем только первые 100, и у нас есть кнопка «Показать все», которая расширяет скрытый DIV со строками 101+. Мы не кэшируем на веб-сервере и не предлагаем пейджинг.

ГБН
источник
Спасибо. И какой подход лучше, если пользователь меняет некоторые критерии сортировки? Должен ли я выполнить запрос еще раз с новыми критериями или отсортировать результаты на клиенте?
Томас Валек
1
Я бы перебрал клиента. Данные уже есть. Да, база данных хороша для сортировки, но если данные одинаковы и доступны, зачем делать еще один вызов? Мы используем дополнение jQuery для включения сортировки в браузере :-)
gbn
4

Это зависит от вашей среды. Я бы настроил тест с использованием обоих методов и посмотрел, какой из них лучше всего подходит для вас. Лично я бы страницу на сервере. Чем меньше данных по проводам и меньше данных в оперативной памяти клиента, тем лучше. Если вы можете управлять спецификациями клиентского компьютера, весь трафик идет по ненасыщенной локальной сети, и клиенты всегда быстро пролистывают несколько страниц, тогда вам может потребоваться страница на клиенте.

Эрик Хамфри - Лотсхелп
источник
Спасибо. На самом деле мне нужно и то и другое: связь между сервером и клиентом реализована в WCF, поэтому для сообщения существует максимальный размер, и если результирующий набор превышает этот размер, я должен отправить больше сообщений для передачи полных данных клиенту. Клиентам также нравится быстро пролистывать несколько страниц ... :(
Томас Валек,