Não há estatísticas geradas nas colunas XML. As estimativas são calculadas com base nas expressões usadas ao consultar o XML.
Usando esta tabela:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
E essa consulta XML bastante simples:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
Fornecerá uma linha retornada, mas as linhas estimadas retornadas serão 200. Serão 200, independentemente de qual XML ou de quanto XML você inserir na coluna XML dessa linha.
Este é o plano de consulta com a contagem estimada de linhas exibida.
Uma maneira de melhorar, ou pelo menos alterar, as estimativas é fornecer ao otimizador de consulta mais informações sobre o XML. Nesse caso, como sei que root
realmente é um nó raiz no XML, posso reescrever a consulta dessa maneira.
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)
Isso me dará uma estimativa de 5 linhas retornadas.
A reescrita da consulta provavelmente não acelerará a fragmentação do XML, mas se as estimativas forem melhores, é provável que o otimizador de consulta possa tomar decisões mais inteligentes para o restante da consulta.
Não encontrei nenhuma documentação sobre quais são as regras para as estimativas, exceto uma apresentação de Michael Rys, onde ele diz:
A estimativa de cardinalidade base é sempre 10.000 linhas!
Algum ajuste baseado em filtros de caminho empurrado