Как получить общее количество результатов в постраничных представлениях результатов? - PullRequest
3 голосов
/ 28 ноября 2009

У меня есть таблица БД с ок. 100 000 записей.

Мое веб-приложение будет показывать разбитых на страницы результаты поисковых запросов, которые могут давать от 0 до 100 000 записей.

При генерации вывода я хочу сделать две вещи:

  • Показать общее количество результатов
  • Показать постраничное представление с 50-100 результатами на страницу.

Очевидно, я хотел бы запрашивать записи только для одной страницы за раз из БД, но здесь возникает дилемма - как получить COUNT () без выполнения всего запроса?

А если мне нужно выполнить весь запрос, не лучше ли выбрать его все и кэшировать в памяти?

Что вы обычно делаете в таком случае, если мы находимся в диапазоне 100 записей за набор результатов?

В основном, Какой самый эффективный способ показать сообщение «найденные результаты ххххх» и результаты разбиты на страницы?

Ответы [ 3 ]

1 голос
/ 28 ноября 2009

Показывать общее количество страниц дорого. База данных должна завершить ваш запрос до последней строки. Он должен читать их с диска, выполнять объединения, оценивать, где предложения и вычисления столбцов.

Так что это дорого, но стоит ли это того? Оказывается, общее количество страниц - это функция, которой никто не пользуется. Так что не отвлекайтесь на то, чтобы тратить на это много времени. Это того не стоит.

Не показывать общее количество страниц.

1 голос
/ 28 ноября 2009

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

В зависимости от значения счетчика вы можете выбрать свою стратегию поиска / подкачки.

Довольно много постов, связанных с пейджингом в SO здесь .

0 голосов
/ 29 ноября 2009

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

Я бы повторил "стоит ли это того?" настроение выражается в других ответах.

DECLARE @StartRow INT
DECLARE @EndRow INT
SET @StartRow = 10;
SET @EndRow = 30;

SELECT M.[RowID], M.[UPRN], M.[Address_1], M.RowID+RowID2 as [TotalRows]
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY A1.UPRN ASC) as RowID,
       ROW_NUMBER() OVER (ORDER BY A1.UPRN DESC) as RowID2,
       A1.UPRN, 
       A1.Add_1
          FROM Core.Addresses A1
    ) as M
    WHERE M.RowID BETWEEN @StartRow and @EndRow
...