Olá!
Este post é uma dica rápida para paginação usando o T-SQL no Sql Server.
É muito comum precisarmos de paginação mas, muitas vezes, este processo é realizado diretamente no código da aplicação e acaba exigindo a carga de um alto volume de dados na memória para que, em seguida, ocorra seu particionamento em páginas. Não preciso dizer que teremos um enorme desperdício de memória e, no caso de uma aplicação C#, um trabalhão para o Garbage Collector, que precisará excluir da memória os dados não utilizados.
Pois bem, este problema pode ser resolvido muito facilmente utilizando duas instruções que complementam o Order By
: Offset
e Fetch
.
Primeiro, vou mostrar um exemplo de consulta utilizando os recursos e, em seguida, explico como a mágica acontece:
CREATE PROCEDURE [dbo].[CustomerPagedList]
@Page INT,
@PageSize INT
AS
BEGIN
SET NOCOUNT ON;
SELECT
Id,
FirstName,
LastName
FROM
Customer
WHERE
BirthDate >= '2000-01-01'
ORDER BY
Id
OFFSET
((@Page -1) * @PageSize) ROWS
FETCH
NEXT (@PageSize) ROWS ONLY
END
Parece fácil. Não? E é mesmo!
A instrução Offset
vai pular a quantidade de linhas informada. Neste caso, se @Page
receber 2, e @PageSize
receber 10, serão 10 linhas. Já a instrução Fetch
, seguida de Next
, vai devolver apenas a quantidade de próximas linhas informada depois do Offset
. Neste caso, usando o exemplo anterior, sendo @PageSize
10, serão retornadas apenas as próximas 10 linhas, de 11 a 20.
Com essa abordagem você consegue definir um subset de registros a obter de sua base, sem a necessidade de obter todos os registros e usar uma estratégia de, por exemplo em C#, Skip
e Take
via Linq. Isso reduzirá o tráfego de dados entre a base e a aplicação, economizará memória (e trabalho do Garbage Collector), aumentando assim o desempenho das consultas paginadas da sua aplicação.
Gostou? Me deixe saber pelos indicadores! Dúvidas? Me envie pelos comentários que respondo assim que puder.
Até a próxima!
Referências:
SELECT – Cláusula ORDER BY (Transact-SQL)
Top comments (0)