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!
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 >>
|