Für XML-Spalten werden keine Statistiken generiert. Die Schätzungen werden basierend auf den Ausdrücken erraten, die beim Abfragen des XML verwendet werden.
Verwenden dieser Tabelle:
create table T(XMLCol xml not null)
insert into T values('<root><item value = "1" /></root>')
Und diese ziemlich einfache XML-Abfrage:
select X.N.value('@value', 'int')
from T
cross apply T.XMLCol.nodes('root/item') as X(N)
Sie erhalten eine zurückgegebene Zeile, aber die geschätzten zurückgegebenen Zeilen sind 200. Es sind 200, unabhängig davon, welches XML oder wie viel XML Sie in die XML-Spalte für diese eine Zeile einfügen.
Dies ist der Abfrageplan mit der geschätzten angezeigten Zeilenanzahl.
Eine Möglichkeit, die Schätzungen zu verbessern oder zumindest zu ändern, besteht darin, dem Abfrageoptimierer weitere Informationen zum XML zu geben. In diesem Fall kann ich die Abfrage wie folgt umschreiben , da ich weiß, dass dies root
wirklich ein Stammknoten im XML ist.
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)
Das gibt mir eine Schätzung von 5 zurückgegebenen Zeilen.
Das Umschreiben der Abfrage beschleunigt wahrscheinlich nicht das Shredden des XML. Wenn die Schätzungen jedoch besser sind, kann das Abfrageoptimierungsprogramm möglicherweise intelligentere Entscheidungen für den Rest der Abfrage treffen.
Ich habe keine Dokumentation zu den Regeln für die Schätzungen gefunden, außer einer Präsentation von Michael Rys, in der er sagt:
Die Schätzung der Basiskardinalität beträgt immer 10'000 Zeilen!
Einige Anpassungen basieren auf Push-Path-Filtern