Лучший подход к использованию Top and Count - SQL Server 2008 - PullRequest
3 голосов
/ 07 июля 2011

У меня есть приложение C # 2008 (серверная часть SQL Server 2008), где иногда запросы возвращают большое количество результатов.Итак, я исследовал некоторые алгоритмы пейджинга и использовал один из них, использующий оператор TOP.Мне нравится тот факт, что если у меня всего 500 результатов и я показываю только 20 результатов на странице, я могу запросить в базе данных только 20 записей вместо сохранения всех 500 записей в памяти.что для реализации алгоритма разбиения на страницы мне нужно знать, сколько всего записей в этом запросе.Итак, я просто запустил другой запрос с теми же параметрами, который просто выбирает идентификатор (а не весь объект), чтобы попытаться запустить его быстро.По какой-то причине, я думаю, что выполнение этих двух запросов (таким образом, установление двух соединений) не лучший подход.

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

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

Ответы [ 5 ]

0 голосов
/ 07 июля 2011

Я бы попробовал что-то вроде этого:

;WITH CTE AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row,
        COUNT(*) OVER() AS TotalCount,
        Description, Date 
    FROM Log
)

SELECT *
FROM CTE
WHERE Row BETWEEN 1 AND 10

Это обеспечит как пейджинг, так и счет в 1 запросе. Вы также можете использовать оператор CASE только для подсчета в определенное время. Например, изменяется ли количество, пока пользователи выполняют постраничную передачу?

0 голосов
/ 07 июля 2011

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

0 голосов
/ 07 июля 2011

Я бы использовал ROW_NUMBER() OVER (ORDER BY ...).Подробнее здесь .

0 голосов
/ 07 июля 2011

Я не знаю, какой подход вы используете для пейджинга, однако обычно я использую методику использования ROW_NUMBER, например:

SELECT  Description, Date
FROM
(
    SELECT  ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row,
        Description, Date 
    FROM Log
) AS LogWithRowNumbers
WHERE  Row >= 1 AND Row <= 10

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

Конечно, если вы хотите отобразить "общее количество посещений" или подобное на своей странице, вам также понадобится другой запрос, чтобы получить количество строк:

SELECT COUNT(*) FROM Log

Однако вы можете выполнить оба оператора в одном пакете, чтобы избежать необходимости в дополнительном "обратном пути" к серверу базы данных.

Источник - Записи подкачки с использованием базы данных SQL Server 2005 - Функция ROW_NUMBER

0 голосов
/ 07 июля 2011

Вы можете использовать объектный источник данных ... для реализации этой пользовательской подкачки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...