Como implementar a paginação de maneira eficaz?

9

Eu tenho uma consulta ao banco de dados que pode resultar em um grande conjunto de resultados. O cliente que exibe os dados recebe os dados pela rede; portanto, a idéia era minimizar a quantidade de dados transferidos, recuperando apenas os 50 primeiros resultados do banco de dados e enviando-os para o cliente. Então, fornecerei a possibilidade de pular para a segunda página para recuperar os próximos 50 resultados etc. (algo semelhante ao que o Google oferece)

A questão é qual é a maneira eficaz de implementar a paginação. Quero ter certeza de que o mssql use o cache o máximo possível e que o mesmo não seja executado novamente sempre que alterar a paginação.

Existem mais clientes que estão consultando o banco de dados ao mesmo tempo. Mecanismo sql usado: MS SQL 2005

Minhas idéias foram:

  • Use sql statemenst preparado para garantir o compartilhamento do plano de execução
  • use a variável ROW_COUNT para recuperar apenas as linhas necessárias

Mas é realmente a maneira mais eficaz? Ou você acha que seria melhor recuperar todo o conjunto de resultados e implementar a paginação no código que envia os dados para o cliente?

Obrigado por suas dicas!

Atenciosamente, Tomas

Tomas Walek
fonte

Respostas:

7

A consulta será executada sempre. O SQL Server não armazena em cache os resultados.

A paginação adequada não será implementada até o SQL Server 2011, mas até então suas opções (como você identificou) são:

  • ROW_NUMBER () e consultas sob demanda
  • armazenamento em cache do cliente

Uma instrução SQL preparada também será executada sempre.

Se você possui um cliente gordo, o armazenamento em cache é local para o cliente. Isso é bom, a menos que você tenha milhões de blobs, por exemplo.

Em nosso web client, renderizamos todos os resultados, mas apenas mostramos os 100 melhores e temos um botão "Mostrar tudo" que expande um DIV oculto com as linhas 101+. Não armazenamos em cache no servidor da web e não oferecemos paginação.

gbn
fonte
Obrigado. E qual é a melhor abordagem se o usuário alterar alguns critérios de classificação? Devo executar a consulta mais uma vez com os novos critérios ou classificar os resultados no cliente?
Tomas Walek 03/03
11
Eu classificaria no cliente. Os dados já estão lá. Sim, um banco de dados é bom em classificação, mas se os dados são os mesmos e estão disponíveis, por que fazer outra chamada? Usamos um complemento jQuery para permitir a classificação no navegador :-)
gbn 03/03
4

Depende do seu ambiente. Eu configuraria um teste usando os dois métodos e veria qual funciona melhor para você. Pessoalmente, gostaria de paginar no servidor. Menos dados por cabo e menos dados na RAM do cliente, melhor. Se você pode controlar as especificações da máquina cliente, todo o tráfego é feito em uma LAN não saturada e os clientes sempre paginam várias páginas rapidamente, então você pode paginar no cliente.

Eric Humphrey - lotes de ajuda
fonte
Obrigado. Na verdade, eu preciso dos dois: a comunicação entre servidor e cliente é implementada no WCF, para que haja um tamanho máximo para uma mensagem e, se o conjunto resultante exceder esse tamanho, devo enviar mais mensagens para transferir os dados completos para o cliente. Os clientes também gosta de folhear várias páginas rapidamente ... :(
Tomas Walek