Comment mettre en œuvre la pagination de manière efficace?

9

J'ai une requête de base de données qui pourrait entraîner un grand ensemble de résultats. Le client qui affiche les données reçoit les données sur le réseau, donc l'idée était de minimiser la quantité de données transférées en récupérant uniquement les 50 premiers résultats de la base de données et en les envoyant au client. Ensuite, je fournirai la possibilité de passer à la deuxième page pour récupérer les 50 prochains résultats, etc. (quelque chose de similaire, par exemple, ce que Google propose)

La question est de savoir quel est le moyen efficace de mettre en œuvre la pagination. Je veux m'assurer que mssql utilise autant que possible le cache et que le même n'est pas exécuté à nouveau à chaque fois que je change la pagination.

Il y a plus de clients qui interrogent la base de données en même temps. Moteur sql utilisé: MS SQL 2005

Mes idées étaient:

  • Utilisez un état SQL préparé pour assurer le partage du plan d'exécution
  • utiliser la variable ROW_COUNT pour récupérer uniquement les lignes nécessaires

Mais est-ce vraiment le moyen le plus efficace? Ou pensez-vous qu'il serait préférable de récupérer l'ensemble des résultats et d'implémenter la pagination dans le code qui envoie les données au client?

Merci pour vos conseils!

Cordialement, Tomas

Tomas Walek
la source

Réponses:

7

La requête sera exécutée à chaque fois. SQL Server ne met pas en cache les résultats.

La pagination appropriée ne sera pas implémentée avant SQL Server 2011, mais d'ici là vos options (comme vous l'avez identifié) sont:

  • ROW_NUMBER () et requêtes sur demande
  • mise en cache du client

Une instruction SQL préparée sera également exécutée à chaque fois.

Si vous avez un gros client, la mise en cache est locale au client. C'est généralement OK sauf si vous avez des millions d'objets blob par exemple.

Dans notre client Web, nous affichons tous les résultats, mais affichons uniquement les 100 premiers et avons un bouton "Afficher tout" qui élargit un DIV masqué avec les lignes 101+. Nous ne mettons pas en cache dans le serveur Web et nous n'offrons pas de pagination.

gbn
la source
Merci. Et quelle est la meilleure approche si l'utilisateur modifie certains critères de tri? Dois-je réexécuter la requête avec les nouveaux critères ou trier les résultats sur le client?
Tomas Walek
1
Je trierais le client. Les données sont déjà là. Oui, une base de données est bonne pour le tri, mais si les données sont les mêmes et disponibles, pourquoi faire un autre appel? Nous utilisons un module complémentaire jQuery pour permettre le tri dans le navigateur :-)
gbn
4

Cela dépend de votre environnement. Je voudrais configurer un test en utilisant les deux méthodes et voir celle qui vous convient le mieux. Personnellement, je paginerais sur le serveur. Moins de données sur le fil et moins de données dans la RAM du client, mieux c'est. Si vous pouvez contrôler les spécifications de la machine cliente, tout le trafic est acheminé via un réseau local non saturé et les clients parcourent toujours plusieurs pages rapidement, vous souhaiterez peut-être effectuer une page sur le client.

Eric Humphrey - lotsahelp
la source
Merci. En fait, j'ai besoin des deux: la communication entre le serveur et le client est implémentée dans WCF, il y a donc une taille maximale pour un message et si l'ensemble résultant dépasse cette taille, je dois envoyer plus de messages pour transférer les données complètes au client. Les clients aiment également parcourir rapidement plusieurs pages ... :(
Tomas Walek