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:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
Et cette requête XML assez simple:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
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.
select X2.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root[1]') as X1(N)
cross apply X1.N.nodes('item') X2(N)
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:
L'estimation de cardinalité de base est toujours de 10 000 lignes!
Certains ajustements basés sur des filtres de chemin poussés