Итак, у меня есть функция, которая возвращает ряд записей, для которых я хочу реализовать разбиение на страницы на моем веб-сайте. Мне было предложено использовать для этого функцию Offset / Fetch Next в SQL Server 2012. На нашем веб-сайте есть область, в которой указано общее количество записей и информация о том, на какой странице вы находитесь в данный момент.
Раньше я получал весь набор записей и мог программно построить на нем подкачку. Но при использовании способа SQL с FETCH NEXT X ROWS ONLY мне возвращаются только X строк, поэтому я не знаю, каков мой общий набор записей и как рассчитать мои минимальные и максимальные страницы. Единственный способ, которым я могу это сделать, - это дважды вызвать функцию и произвести подсчет строк в первой, а затем запустить вторую с помощью FETCH NEXT. Есть ли лучший способ, чтобы я не выполнял запрос дважды? Я пытаюсь увеличить производительность, а не замедлить ее.
источник
Я столкнулся с некоторыми проблемами производительности при использовании метода COUNT ( ) OVER (). (Я не уверен, что это был сервер, поскольку для возврата 10 записей потребовалось 40 секунд, а затем не возникло никаких проблем.) Этот метод работал во всех условиях без использования COUNT ( ) OVER () и выполняет то же самое:
DECLARE @PageSize INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, Name FROM Table ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) SELECT * FROM TempResult, TempCount ORDER BY TempResult.Name OFFSET (@PageNum-1)*@PageSize ROWS FETCH NEXT @PageSize ROWS ONLY
источник
На основании ответа Джеймса Моберга :
Это альтернатива использования
Row_Number()
, если у вас нет SQL Server 2012 и вы не можете использовать OFFSETDECLARE @PageNumEnd INT = 10, @PageNum INT = 1; WITH TempResult AS( SELECT ID, NAME FROM Tabla ), TempCount AS ( SELECT COUNT(*) AS MaxRows FROM TempResult ) select * from ( SELECT ROW_NUMBER() OVER ( ORDER BY PolizaId DESC) AS 'NumeroRenglon', MaxRows, ID, Name FROM TempResult, TempCount )resultados WHERE NumeroRenglon >= @PageNum AND NumeroRenglon <= @PageNumEnd ORDER BY NumeroRenglon
источник