No hay estadísticas generadas en columnas XML. Las estimaciones se adivinan en función de las expresiones utilizadas al consultar el XML.
Usando esta tabla:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
Y esta consulta XML bastante simple:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
Le dará una fila devuelta pero las filas estimadas devueltas son 200. Será 200 independientemente de qué XML o cuánto XML ingrese en la columna XML para esa fila.
Este es el plan de consulta con el recuento de filas estimado que se muestra.
Una forma de mejorar, o al menos cambiar, las estimaciones es proporcionar al optimizador de consultas más información sobre el XML. En este caso, porque sé que root
realmente es un nodo raíz en el XML, puedo reescribir la consulta de esta manera.
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)
Eso me dará una estimación de 5 filas devueltas.
La reescritura de la consulta probablemente no acelerará la destrucción del XML, pero si las estimaciones son mejores, es probable que el optimizador de consultas pueda tomar decisiones más inteligentes para el resto de la consulta.
No he encontrado ninguna documentación sobre cuáles son las reglas para las estimaciones que no sea una presentación de Michael Rys donde dice:
¡La estimación de cardinalidad base es siempre de 10'000 filas!
Algunos ajustes basados en filtros de ruta empujados