Buscar

Últimas inserções

Salvando arquivos do SolidWorks 2010 para versões anteriores(2009, 2008, etc.)
Extraindo a hora de uma data
Embaralhando textos no .NET
Como adicionar THEAD e TBODY ao seu GridView
WebService faz seu processamento , mas retorna string nula.
- TODAS AS DICAS

Top Poggers (sempre)

Cuban Pete (124)
Jar Jar Binks (105)
Tufo (25)

Top Poggers (30 dias)

Jar Jar Binks (7)
Cuban Pete (1)

Área restrita

Logon

pogMasters.NET

Início
Busca Avançada
Contato

RSS
 

Paginação com Stored Procedure (Simples)

T-SQL

24/06/2009 por Cuban Pete


Olá a todos, vou postar aqui um recurso muito útil e eficiente, que é paginar resultados diretamente na base de dados. Isso se torna necessário em casos onde se exige muita performance, deixando de lado a paginação do lado do servidor da aplicação e trazendo somente os dados necessários do banco.

Como funciona a paginação do jeito normal (direto no RecordSet, ou PagedDataSource (vide: http://www.pogmasters.net/pogs/paginando-datalists-ou-repeaters.aspx) por exemplo)?

Funciona assim, a aplicação manda um SELECT * FROM Produto por exemplo pro banco e o banco manda TODOS os registros. Aí antes de renderizar o servidor seleciona somente os dados necessários... Eficiente porém imagina se toda vez ele carregar 100.000 produtos =/

Paginando direto no banco pulamos isso e temos somente os registros que precisamos.

IMPORTANTE:

O script abaixo foi o que eu mais consegui simplificar do que eu já vi na net. Existem exemplos monstros que usam cursor (altamente não recomendado) para fazer isso. Este código é simples e eficiente e de fácil adaptação em suas queries. Segue ele abaixo com comentários:

-- Suponhamos que temos a tabela Produto com as colunas id, idUnidade e descricao.

CREATE PROCEDURE [dbo].[pagged_resultsProduto]
(
@startRowIndex int,
@maximumRows int
)
AS

-- os parametros são, o registro inicial e a qtdade de linhas respectivamente

DECLARE @first_id varchar(500), @startRow int -- o first ID deve ser do tipo da coluna de ordenação, no caso a descrição.

SET ROWCOUNT @startRowIndex

SELECT @first_id = descricao FROM Produto ORDER BY descricao

SET ROWCOUNT @maximumRows

SELECT * FROM Produto WHERE descricao >= @first_id ORDER BY descricao, idUnidade

SET ROWCOUNT 0

SET ROWCOUNT 1

-----
--Testando

exec pagged_resultsProduto 100, 5

-----
É isso... Reparem que se eu quiser mais colunas na ordenação, eu adiciono elas no segundo SELECT (onde eu adicionei idUnidade). De resto é um script super simples e que funciona muito bem. O chato é que você teria que criar uma proc para cada SELECT na sua aplicação que você quisesse paginar, mas o ganho de performance compensa.

Quem cuida de qual página está e será passada é a sua aplicação, poderia vir por exemplo de uma QueryString ou algo do tipo.

Espero que gostem.
Até ++

[keywords]
paginando procedures sql server paginação sql server stored procedure de paginação fácil paginando resultados direto do banco resultset paginado mssql ms sql paginação pagged stored procedures sproc paginação paginacao stored procedure procedures
 
   


Comentários sobre o artigo

24/06/2009 por PogKing

> Top Tip!

24/06/2009 por Herbert Clayton

> Para ficar mais fácil, poderia colocar como template.
Para usar templates:
http://pogmasters.net/pogs/comandos-template-no-sql-server.aspx

06/07/2009 por Teste

> teste

09/02/2010 por Wesley Seidel

> Pode ser interessante fazer a seleção baseado no nr da página e da qnt de registros por pagina.
Por exemplo:

create PROCEDURE exemplo_de_paginacao (
@pageIndex int,
@maximumRows int
)
AS
begin
DECLARE @first_id int, @startRowIndex int

select @startRowIndex = ( @pageIndex * @maximumRows ) - (@maximumRows - 1)
.
.
.


e o resto é o mesmo do post.

Att.

Poste um comentário >>
Nome  
Email
Comentário    
Postar Comentário