Non ci sono statistiche generate su colonne XML. Le stime sono indovinate in base alle espressioni utilizzate durante l'interrogazione dell'XML.
Utilizzando questa tabella:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
E questa query XML piuttosto semplice:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
Ti verrà restituita una riga ma le righe stimate restituite sono 200. Saranno 200 indipendentemente da quale XML o quanto XML inserirai nella colonna XML per quella riga.
Questo è il piano di query con il conteggio delle righe stimato visualizzato.
Un modo per migliorare, o almeno modificare, le stime è fornire all'ottimizzatore di query ulteriori informazioni sull'XML. In questo caso, poiché so che root
è davvero un nodo radice nell'XML, posso riscrivere la query in questo modo.
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)
Questo mi darà una stima di 5 righe restituite.
La riscrittura della query probabilmente non accelererà la distruzione dell'XML ma se le stime sono migliori, è probabile che Query Optimizer possa prendere decisioni più intelligenti per il resto della query.
Non ho trovato alcuna documentazione su quali siano le regole per le stime diverse da una presentazione di Michael Rys in cui dice:
La stima della cardinalità di base è sempre di 10'000 righe!
Alcune regolazioni basate su filtri del percorso spinto