Paginando consulta direto no SQL (SQL Paging)

Publicado: 27/01/2006 em IntoSpaces

Olá pessoal blz???
Hoje vou falar de um tema que não gosto muito, SQL e Bancos de Dados!😛

Apesar de eu não curtir muito ontem apareceu um problema que deu vontade de resolver.

Bom eu estou trabalhando em uma aplicação web para a empresa e estou empregando o Atlas para melhorar a experiência dos usuários.
Até aí tudo bem, funciona perfeitamente com poucos registros, mas à medida que a quantidade de registros vai aumentando, os meus dados que estão paginados com um PagedDataSource tendem a demorar mais para serem processados correto?

O que acontece, eu retorno do banco todos os dados da minha tabela aí com o PagedDataSource eu pagino e jogo tudo no meu repeater.
Isso vai bem por enquanto, mas não adianta nada eu ter uma interface rica com Atlas e a consulta no banco se tornar lenta confere, então estava pensando em deixar o PageDataSource de lado e paginar meus dados manualmente, tudo em nome da perfomance.

Aí surgiu a dúvida, pois o ideal seria paginar os dados diretamente na minha consulta, que retornaria sempre uma quantidade mínima de ítens, no caso a quantidade de ítens a serem exibidos por página.

A resolução do problema é de crédito do nosso amigo Renato Guimarães, quem manda muito bem de SQL! Valeu Renato!

Então as informações que temos são:
Página Atual -> PageIndex
Quantidade de Registros por página -> PageCount
Chave primária da tabela -> PK
Nome da Tabela -> TableName

Agora precisamos montar nossa consulta de maneira a filtrar somente os dados necessários, utlizamos uma sub-consulta para isso:

SELECT TOP (PageCount) PK FROM TableName
    WHERE (PK NOT IN 
                       (SELECT TOP (PageIndex * PageCount) PK FROM TableName)
                   )

É simples não?
Primeiro fazemos uma consulta que pega somente a quantidade de dados necessária para a página atual.
Por exemplo, se estivermos na página 10 e cada página puder conter no máximo 5 registros essa consulta vai retornornar os 50 primeiros registros apenas, eliminando todo o resto não necessário.

Agora queremos selecionar somente a quantidade a ser exibida na página e é isto que nossa consulta principal faz, ela seleciona somente a quantidade que eu quero dentro da tabela retoanada pela consulta, ela retorna somente 5 registros que não estão dentro da consulta dela, os 5 próximos no caso.

Pronto temos uma paginação feita diretamente no banco de dados, elevando a performance da aplicação sendo que o SQL é inteligente ao ponto de eliminar todos os registros que ele não vai usar, com isso poderemos ter muito mais consultas ao mesmo tempo sem perda de performance, aliado ao Atlas isso da uma respostas instantânea facilitando a vida de todo mundo!

Boas consultas à todos!

[]’s
Shinji

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s