Я работаю над возвращением набора записей из SQL Server 2008, чтобы выполнить нумерацию страниц. Я возвращаю только 15 записей за раз, но мне нужно иметь общее количество совпадений и подмножество записей. Я использовал два разных запроса со смешанными результатами в зависимости от того, где в большей группе мне нужно вытащить подмножество. Вот образец:
SET NOCOUNT ON;
WITH tempTable AS (
SELECT
FirstName
, LastName
, ROW_NUMBER() OVER(ORDER BY FirstName ASC) AS RowNumber
FROM People
WHERE
Active = 1
)
SELECT
tempTable.*
, (SELECT Max(RowNumber) FROM tempTable) AS Records
FROM tempTable
WHERE
RowNumber >= 1
AND RowNumber <= 15
ORDER BY
FirstName
Этот запрос работает действительно быстро, когда я возвращаю элементы в нижнем конце совпадений, например записи с 1 по 15. Однако, когда я начинаю возвращать записи 1000 - 1015, обработка будет идти из-под от секунды до более 15 секунд.
Поэтому я изменил запрос на следующий:
SET NOCOUNT ON;
WITH tempTable AS (
SELECT * FROM (
SELECT
FirstName
, LastName
, ROW_NUMBER() OVER(ORDER BY FirstName ASC) AS RowNumber
, COUNT(*) OVER(PARTITION BY NULL) AS Records
FROM People
WHERE
Active = 1
) derived
WHERE RowNumber >= 1 AND RowNumber <= 15
)
SELECT
tempTable.*
FROM tempTable
ORDER BY
FirstName
Этот запрос запускает возврат большого числа за 2-3 секунды, но также выполняет запросы с меньшим числом через 2-3 секунды. Поскольку он выполняет подсчет для каждой из 70 000 строк, он делает каждый запрос более длинным, чем просто большие номера строк.
Так что мне нужно выяснить, как получить хороший счетчик строк, а также вернуть только подмножество элементов в любой точке набора результатов, не подвергаясь такому огромному штрафу. Я мог бы справиться с 2-3-секундным штрафом за высокие числа строк, но 15 - это слишком много, и я не желаю терпеть медленные нагрузки на первых нескольких страницах, которые просматривает человек.
ПРИМЕЧАНИЕ : я знаю, что мне не нужен CTE во втором примере, но это всего лишь простой пример. В процессе работы я делаю дальнейшие соединения с tempTable после того, как отфильтровал его до 15 нужных мне строк.