J'exécute une requête qui traite certains nœuds d'un document XML. Mon coût estimé de sous-arbre est de plusieurs millions et il semble que tout cela provienne d'une opération de tri que le serveur SQL exécute sur certaines données que j'extrais des colonnes xml via XPath. L'opération de tri a un nombre estimé de lignes à environ 19 millions, tandis que le nombre réel de lignes est d'environ 800. La requête elle-même fonctionne assez bien (1 à 2 secondes), mais l'écart me pose des questions sur les performances de la requête et pourquoi cela la différence est si grande?
sql-server
query-performance
xml
Peter Smith
la source
la source
Réponses:
Aucune statistique n'est générée sur les colonnes XML. Les estimations sont devinées sur la base des expressions utilisées lors de l'interrogation du XML.
En utilisant ce tableau:
Et cette requête XML assez simple:
Vous donnera une ligne retournée, mais le nombre estimé de lignes retournées est de 200. Ce sera 200, quel que soit le XML ou la quantité de XML que vous remplissez dans la colonne XML pour cette ligne.
Il s'agit du plan de requête avec le nombre de lignes estimé affiché.
Un moyen d'améliorer, ou du moins de modifier, les estimations est de donner à l'optimiseur de requête plus d'informations sur le XML. Dans ce cas, parce que je sais que c'est
root
vraiment un nœud racine dans le XML, je peux réécrire la requête comme ceci.Cela me donnera une estimation de 5 lignes retournées.
La réécriture de la requête n'accélérera probablement pas le déchiquetage du XML mais si les estimations sont meilleures, il est probable que l'optimiseur de requête puisse prendre des décisions plus intelligentes pour le reste de la requête.
Je n'ai trouvé aucune documentation sur les règles applicables au budget autre qu'une présentation de Michael Rys où il dit:
la source