2017-05-17 4 views
3

Étant donné que j'ai une requête simple:Pourquoi une requête paginée est-elle plus lente qu'une requête simple avec Spring Data?

List<Customer> findByEntity(String entity); 

Cette requête renvoie 7k enregistrements 700ms.

Page<Customer> findByEntity(String entity, Pageable pageable); 

Cette requête renvoie 10 enregistrements en 1080ms. Je suis conscient de la requête de comptage supplémentaire pour la pagination, mais quelque chose semble encore éteint. Aussi une chose étrange que j'ai remarquée est que si j'augmente la taille de la page de 10 à 1900, le temps de réponse est exactement le même autour de 1080 ms.

Des suggestions?

Répondre

9

Il se peut en effet que la requête de compte soit chère ici. Si vous insistez pour connaître le nombre total d'éléments correspondant à la collection, il n'y a malheureusement aucun moyen de contourner cette requête supplémentaire. Cependant, il y a deux possibilités pour éviter plus de frais généraux si vous êtes en mesure de sacrifier sur les informations renvoyées:

  1. En utilisant Slice comme type de retour-Slice n'expose pas une méthode pour connaître le nombre total des éléments, mais cela vous permet de savoir si une tranche suivante est disponible. Nous évitons ici la requête de comptage en lisant un élément de plus que demandé et en utilisant sa (non) présence comme indicateur de la disponibilité d'une tranche suivante.
  2. En utilisant List comme type de retour - Cela va simplement appliquer les paramètres de pagination à la requête et retourner la fenêtre des éléments sélectionnés. Cependant, il ne vous laisse aucune information indiquant si les données suivantes sont disponibles.
1

Méthode avec deux requêtes exécute la pagination:

1) select count(e.id) from Entity e //to get number of total records 
2) select e from Entity e limit 10 [offset 10] //'offset 10' is used for next pages 

La première requête tourne lentement sur les dossiers 7k, à mon humble avis.

Prochaine publication Ingalis de Spring Les données utiliseront un algorithme amélioré pour les requêtes paginées (more info).

Des suggestions?

Je pense que l'utilisation d'une requête paginée avec des enregistrements 7k est inutile. Vous devriez le limiter.