Ich führe eine Abfrage aus, die einige Knoten aus einem XML-Dokument verarbeitet. Meine geschätzten Teilbaumkosten liegen in Millionenhöhe und es scheint, dass alles von einer Sortieroperation stammt, die der SQL Server für einige Daten ausführt, die ich über XPath aus XML-Spalten extrahiere. Die Sortieroperation hat eine geschätzte Anzahl von Zeilen von ungefähr 19 Millionen, während die tatsächliche Zeilenanzahl ungefähr 800 beträgt. Die Abfrage selbst läuft ziemlich gut (1 - 2 Sekunden), aber die Diskrepanz lässt mich über die Abfrageleistung und warum dies nachdenken Unterschied ist so groß?
sql-server
query-performance
xml
Peter Smith
quelle
quelle
Antworten:
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:
Und diese ziemlich einfache XML-Abfrage:
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.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:
quelle