Optimisation des performances des requêtes

Les conseils et techniques qui suivent vous aideront à optimiser les performances de vos requêtes.

Utiliser des paramètres

Lorsqu'une requête s'exécute, la syntaxe de la chaîne de la requête doit être analysée et un plan doit être développé pour l'exécution de la requête, ce qui, dans les deux cas, peut s'avérer assez onéreux. WebSphere eXtreme Scale met en cache les plans de requête d'après la chaîne de requête. Le cache ayant une taille non illimitée, il est important de réutiliser autant que possible les chaînes de requêtes. L'utilisation de paramètres nommés ou positionnels est également un facteur de performances car il favorise la réutilisation des plans de requête.

Positional Parameter Example Query q = em.createQuery("select c from Customer c where c.surname=?1"); q.setParameter(1, "Claus");

Utiliser des index

L'indexation correctement conçue d'une mappe peut avoir un impact significatif sur les performances des requêtes, même si l'indexation a par elle-même sa part de charge système dans les performances globales de la mappe. Sans indexation des attributs d'objets impliqués dans les requêtes, pour chacun des attributs, le moteur de requête est en effet obligé d'analyser les tables. Une analyse de tables est l'opération la plus onéreuse au cours de l'exécution d'une requête. L'indexation des attributs d'objets qui sont impliqués dans la requête permet au moteur de requête d'éviter les analyses superflues de tables et ne peut qu'améliorer les performances générales de la requête. Si l'application est conçue pour faire un usage intensif consistant essentiellement à lire une mappe, configurez des index pour les attributs d'objets qui sont impliqués dans la requête. Si au contraire la mappe est le plus souvent actualisée, vous devez trouver un équilibre entre l'amélioration des performances des requêtes et la charge imposée par l'indexation à la mappe.

Lorsque des objets POJO sont stockés dans une mappe, une indexation correctement conçue peut éviter une réflexion Java. Dans l'exemple qui suit, la requête remplace la clause WHERE par une recherche d'index de plage si un index est construit sur la zone budget. Sinon, la requête analyse la mappe toute entière et évalue la clause WHERE en obtenant d'abord le budget à l'aide d'une réflexion Java, puis en comparant le budget avec la valeur 50000 :

SELECT d FROM DeptBean d WHERE d.budget=50000

Voir Plan de requête pour savoir comment optimiser au maximum des requêtes individuelles et en quoi différentes syntaxes, différents modèles d'objets et différents index peuvent affecter les performances des requêtes.

Utiliser la pagination

Dans des environnements client-serveur, le moteur de requête transporte vers le client la totalité de la mappe résultante. Les données retournées doivent alors être fractionnées en morceaux raisonnables. Les interfaces Query d'EntityManager et ObjectQuery d'ObjectMap prennent toutes les deux en charge les méthodes setFirstResult et setMaxResults qui permettent à la requête de retourner un sous-ensemble des résultats.

Retourner des valeurs primitives plutôt que des entités

Avec l'API Query d'EntityManager, les entités sont retournées comme des paramètres de requête. Le moteur de requête retourne couramment au client les clés de ces entités. Lorsque le client opère une itération sur ces entités à l'aide de l'Iterator de la méthode getResultIterator, chacune de ces entités est automatiquement agrandie et gérée comme si elle avait été créée avec la méthode find de l'interface EntityManager. Le graphe entier des entités est construit sur le client à partir de la mappe d'objets entités. La résolution des attributs value des entités et des éventuelles entités en rapport s'effectue avec peine.

Pour éviter d'avoir à construire le graphe, opération toujours onéreuse, il suffit de modifier la requête pour qu'elle retourne les attributs individuels avec navigation via le chemin.

Exemple :

// Retourne une entité
SELECT p FROM Person p
// Retourne des attributs SELECT p.name, p.address.street, p.address.city, p.gender FROM Person p