Wir verwenden eine XML-Spalte neben dem traditionellen Säulen in ein paar Tabellen in unserer SQL Server 2008 R2-Datenbank mit der Struktur wie folgt:SQL XML - existieren: Gibt es einen besseren Weg?
<bridging>
<project id="43" source="true" />
<project id="48" source="false" />
<project id="99" source="false" />
<project id="123" source="false" />
</bridging>
Dann wählen wir Daten aus diesen Tabellen mit einem .exist Verwendung von gespeicherten Procs XPath-Abfrage in der WHERE-Klausel wie folgt:
SELECT
e.ID,
e.ProjectsBridge,
e.Quantity,
e.Rate,
e.UOMID,
u.Name as UOM
FROM
tblEstimator e LEFT OUTER JOIN
tblUnitOfMeasure u ON u.ID = e.UOMID
WHERE
(e.ProjectsBridge.exist('//bridging/project/@id[. = sql:variable("@ProjectID")]') = 1 OR
@ProjectID IS NULL)
diese sehr gut auf einem kleineren Datenmenge funktioniert, aber je größer die Datenmenge ist, desto langsamer das bekommt - das obige Beispiel auf einem Datensatz von einem weit über 2 Minuten in Betrieb Millionen-ungerade Datensätze.
Die Frage ist also, ob es eine bessere, schnellere Möglichkeit gibt, diese Abfrage durchzuführen?
Würde ein XML-Schema auf die Spalte einen signifikanten Unterschied machen?
Ich weiß nicht, wie groß die Xml-Dokumente Sie haben in der Datenbank sind aber von XPath Sicht Nachfahr-oder-Selbst-Achse (d. h. "//") ist eine der kostenintensivsten Operationen. Versuchen Sie, Ihren XPath in '/ bridging/project [@id = sql: variable ("@ ProjectID")] zu ändern und sehen Sie, ob sich die Geschwindigkeit etwas erhöht. Ich weiß nicht, ob das Verwenden des Schemas die Dinge beschleunigen kann, aber mein Bauchgefühl ist, dass es nicht geht. Ich vermute, dass es nur verhindert, dass Dokumente in die Datenbank eingefügt werden, die nicht gemäß dem Schema gültig sind. – Pawel
Ich habe versucht, ein Schema anzuwenden, und das macht kaum einen Unterschied, und das Ändern des XPath wie oben gewinnt mich 1 Sekunde auf 138, also kein Gewinn wirklich zu sprechen. Danke für die Antwort! – ReinhardtB