SQL Server 2012 – Como criar paginação de dados nos resultados de uma consulta com OFFSET e FETCH

Visualizações: 964
Tempo de Leitura: 3 minutos

Fala galera!

Nesse post, eu gostaria de demonstrar a vocês como criar uma paginação de dados no SQL Server, de modo que apenas uma quantidade limitada de registros sejam retornados pelas consultas, fazendo com que menos dados sejam processados na saída e as consultas tenham um tempo de resposta menor. Cenário esse, que é bastante comum em aplicações, que costumam paginar os dados na tela, tanto para evitar o excesso de informação quanto para diminuir o tempo necessário para carregar as informações.

Com o surgimento do ROW_NUMBER() no SQL Server 2005, muitas pessoas passaram a utilizar essa função para criar paginação de dados, funcionando desta forma:

Resultado:

Entretanto, a partir do SQL Server 2012 temos a funcionalidade de paginação nativa no próprio SQL Server e que muita gente acaba não utilizando por desconhecimento. Estamos falando do recurso OFFSET e FETCH, que funcionam juntos para permitir que possamos paginar os nossos resultados antes de exibir e enviá-los para as aplicações e clientes.

Vejam com o seu uso é simples:

Resultado:

E se a gente quiser algo parametrizável, assim como o exemplo anterior, podemos utilizar a mesma estrutura do exemplo anterior:

Vamos agora, analisar o desempenho das duas consultas para verificar se além da facilidade, temos alguma vantagem em relação à performance:

Plano de Execução – ROW_NUMBER()

Plano de execução – OFFSET e FETCH

Analisando o plano de execução, a solução com OFFSET e FETCH parece utilizar menos operadores e apresentar um plano mais simples. Vamos agora os números na prática:

Vou alterar as consultas e tentar ordenar por uma coluna VARCHAR, não indexada, para verificar se há alguma mudança no desempenho das 2 soluções:

Bom, analisando os resultados dos testes que realizei, ficou claro que, embora essa solução seja mais prática de implementar, ela fica um pouco atrás no quesito performance.

Acredito que em um cenário real do dia a dia, essa diferença de performance acabe não sendo tão relevante (dependendo do uso da aplicação), mas fica a dica sobre a relação de custo x benefício entre praticidade e performance ao utilizar paginação no SQL Server com ROW_NUMBER() ou OFFSET + FETCH. Caso você queira se aprofundar na análise de performance do OFFSET + FETCH, recomendo a leitura do do artigo Pagination with OFFSET / FETCH : A better way, do Aaron Bertrand.

Espero que tenham gostado desse post, onde apresentei como criar paginação de dados no SQL Server utilizando ROW_NUMBER() ou OFFSET + FETCH NEXT n ROWS ONLY.
Um abraço e até a próxima!