On trouvera ci-dessous des explications sur chaque conseil.
KO Voici les choses à éviter:
OK Voici les points recommandés pour l'optimisation :
Qualité Voici les points recommandés pour la qualité du code. On trouvera ici un exemple de XQuery correct : TODO
EXPLICATIONS Pas de eval() Il faut savoir que le code XQuery, après compilation, est mis en cache par eXist. Et bien sûr, les arguments de la fonction eval() ne peuvent pas être mis en cache. Mais surtout l'utilisation de la fonction eval() conduit à un style de programmation difficile à relire et à débugger. De plus on peut toujours remplacer eval() par une tournure standard. Pas d'expressions évaluées plusieurs fois ou inutiles eXist ne pratique aucune analyse et optimisation du genre de celles pratiquées par un compilateur Java: factorisation de sous-expressions communes, élimination de code mort, etc. Il faut veuiller en particulier aux sous-expressions communes, qu'il faut stocker dans une variable, ce qui concourt aussi à la lisibilité du code. Pas de // $a//b conduit à parcourir complètement le (ou les) sous-arbre pointés par $a à la recherche d'un élément <b> . En général on sait assez précisément où il se trouve. Pas de requête sur une
expression contruite let $e := <a><b>content</b></a>
Limiter au maximum les recherches portant sur un critère Une requête telle que $res := collection("/db/projects")/a/b [ id = $val ]conduit à parcourir complètement une collection. Bien sûr de telles requêtes forment la base d'un script XQuery (et la majeure partie du temps écoulé). Mais une fois qu'on a obtenu le résultat $res, on peut naviguer très efficacememt par parents, enfants, et frère à partir de là : $a := $res / parent::a Utilisation judicieuse des index pour les recherches portant sur un critère Il y a actuellement trois types d'index utilisateur dans eXist. Tous nécessitent une indexation préalable de la base ou d'une arborescence de sous-collections.
Les index 1. et 2. sont moins performants, mais ont deux avantages:
L'index 3. n'a pas ces 2 avantages, mais est presque aussi performant qu'une base relationelle. Il ne permet pas de se restreindre à un chemin XPath, mais seulement à un nom de balise. Les index 2. et 3. sont tous deux typés (entiers, ou chaînes) , et permettent de sélectionner par critère d'égalité ou d'inégalité (comparaison). |