Статистика по столбцам XML не генерируется. Оценки предполагаются на основе выражений, используемых при запросе XML.
Используя эту таблицу:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
И этот довольно простой XML-запрос:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
Даст вам одну возвращаемую строку, но оценочные возвращенные строки будут равны 200. Это будет 200 независимо от того, какой XML или сколько XML вы вставляете в столбец XML для этой одной строки.
Это план запроса с отображаемым предполагаемым количеством строк.
Чтобы улучшить или хотя бы изменить оценки, можно предоставить оптимизатору запросов дополнительную информацию о XML. В этом случае, поскольку я знаю, что это root
действительно корневой узел в XML, я могу переписать запрос следующим образом.
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)
Это даст мне оценку 5 возвращенных строк.
Переписывание запроса, вероятно, не ускорит уничтожение XML, но если оценки будут лучше, есть вероятность, что оптимизатор запросов может принимать более разумные решения для остальной части запроса.
Я не нашел никакой документации о правилах оценки, кроме презентации Майкла Риса, где он говорит:
Базовая оценка кардинальности всегда 10 000 строк!
Некоторая корректировка на основе проталкиваемых фильтров пути