DEV Community

Cover image for Dica rápida: Paginando no MSSQL com Offset e Fetch
William Santos
William Santos

Posted on

Dica rápida: Paginando no MSSQL com Offset e Fetch

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
Enter fullscreen mode Exit fullscreen mode

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)

Oldest comments (0)