SQL server 2008-XML-Datentyp, der von performance-Problemen
Hallo ich habe ein Bedürfnis zu lagern Hunderte, wenn nicht Tausende von Elementen in der Datenbank als XML. Ich werde nicht index etwas in das XML-Feld. Ich werde einfach wählen Sie bestimmte Elemente innerhalb der xml-Datei. Ich würde gerne wissen, ob es irgendwelche performance-Strafe für einfach auswählen der Felder in der XML. Hier ist Beispiel-XML wird in der Datenbank gespeichert werden.
<fields>
<field name="FirstName" type="text" value="Gary" sort="2" />
<field name="LastName" type="text" value="Smith" sort="3" />
<field name="City" type="text" value="Los Angeles" sort="4" />
<field name="Age" type="number" value="12" sort="6" />
<field name="Address" type="text" sort="2">
<streetnumber value="1234" />
<streetname value="sail" />
</field>
</fields>
Werde ich wahrscheinlich mehr als 3000 field-tags in einem Datensatz. Ich möchte einfach bekommen Sie 10 Felder in einer einzigen Abfrage. Ich habe einen primary key auf die Tabelle und Auswahl von Datensätzen basierend auf den primär-Schlüssel, aber immer werden die Felder aus der XML-Spalte. Ich fürchte, die mehrere field-Elemente, die ich in der XML wird der Kompromiss Leistung. Wird es eine performance-Strafe für einfach durch Auswahl von 10 oder mehr Felder aus der XML-Spalte? Auch ich werde nicht mit der xml-Spalte in einer where-Klausel verwende ich für die wichtigsten in der where-Klausel dann wähle ich die Felder aus der XML-Spalte. Gibt es Leistungseinbußen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf meiner Erfahrung auf XML in SQL Server-Xml-Datentyp, und auf Indizes für Spalten des Typs XML-Daten (der ganze Abschnitt verdient gründliches Lesen)
Ja, weil Ihr XML-Dokument als blob gespeichert werden. Ohne einen primären XML-index, dieses blob muss aufgelöst werden für die Verarbeitung der Abfrage (Filterung und Projektion)
Als XML-Indizes können gesehen werden als relationale Darstellung des Dokuments (pre-Explosion der blob)
Als zu Ihrer zweiten Frage,
Wenn Sie gehen, um Projekt unter 3000 Feld tags, die Sie könnte profitieren von einer sekundären XML-index, aber ich bin mir nicht sicher welchen. EIGENSCHAFT sekundären index scheint fit für die Projektion, aber es scheint zu gelten
value
Anrufe (die französische Dokumentation scheint zu implizieren mehr als nurvalue
Anrufe, aber das kann einige übersetzungsfehler)Ich für meinen Teil beendet-up-Einstellung der drei Arten von sekundären Indizes auf meiner XML-Spalte (1 Millionen Dokumente aus über 30 verschiedenen schemas, 50-100 Elemente jeder), Aber meine app benötigt eine Menge mehr Filter-als Projektion.
[BEGIN BEARBEITEN]
jbl direkte Antworten auf Ihre Fragen und Terror.Blade Antwort re " XML ist besser als NVARCHAR(MAX), beide machen Sinn (ich von Ihnen positiv bewertet werden Sie :).
Meine Erfahrung war, ohne die Speicherung eines XML-Schemas in SQL Server (Schrecken.Blade-tip), und ohne Indizierung (jbl Gaben die meisten, re' das)... aber ich lasse meine Antwort, weil ich denke, dass meine links wären sehr hilfreich... und es ist immer noch ein Beispiel für worst-case 😉
[ENDE EDIT]
Aus Erfahrung kann ich Ihnen sagen, dass die laden eines XML-Daten-Typ ist schnell, aber, wie es zu verwenden-ich fand, dass langsam sein, aber das persönliche Beispiel in den Sinn kommen beteiligt aktualisieren und verwenden von xQuery, und diese wurden möglicherweise Faktoren in meinem Verlangsamung.
In diesem Beispiel dauerte es 1hr55mins verarbeiten nur 127,861 Zeilen.
(Schrecken.Klinge ist Spitze, der die Speicherung eines XML-Schemas in SQL Server, und die jbl 's link & share-re' XML-Indizierung beide klingen ziemlich glatt 😉 und vielleicht Adresse, die Verlangsamung.)
VERWANDTE:
Hier sind einige Tipps, re' Optimierung von XML in SQL... obwohl einige von Ihnen gelten nur, wenn Sie die Kontrolle über das format der XML:
http://msdn.microsoft.com/en-us/library/ms345118.aspx
Wenn Sie xQuery, schauen Sie sich diese docs:
http://download.microsoft.com/download/0/F/B/0FBFAA46-2BFD-478F-8E56-7BF3C672DF9D/XQuery%20Language%20Reference.pdf
((Und wenn Sie SQLXMLBulkLoad an alle, die erwägen, mit "overflow-Bereich"s, um zu erfassen, was nicht im schema definiert. Es gibt einige nützliche Tipps in diesem peripher mit TechNote:
http://social.technet.microsoft.com/Forums/sqlserver/en-US/393cf604-bf6e-488b-a1ea-2e984aa14500/how-do-i-redirect-xml-comments-that-sqlxmlbulkload-is-storing-in-the-overflowfield?forum=sqlxml ))
HTH.
Ich feststellen, dass dies nicht die direkte Antwort auf die OP-Frage (obwohl, es ist im Zusammenhang mit der es), aber ich glaube, das könnte wirklich helfen, viele Menschen, die umgeleitet wurden hier suchen einige Idee, wie Sie sich mit der schlechten Leistung bei der XML-Datentyp in SQL Server. Nach vielen Jahren kämpfen mit diesem Problem, habe ich endlich eine Lösung gefunden, dass aus irgendeinem Grund, ist nicht so leicht zu bekommen:
SXI - Selektive XML-Indizes (ab SQL 2008)
MS-Docs-link:
https://docs.microsoft.com/en-us/sql/relational-databases/xml/selective-xml-indexes-sxi?view=sql-server-2017
Auf meinen lokalen tests mit Tabellen mit 3MM+ Datensätze, es funktionierte erstaunlich gut!