Ich definiere mit SQL Server 2008 ein Schema für einen neuen Satz von Ressourcen ... In diesem Fall muss jeder Datensatz ( z. B. Zeile ) XML-Fragmente speichern. Von Zeit zu Zeit; obwohl nicht häufig; Ich muss das XML abfragen, um Element- und Attributwerte zu finden. Wenn ich es meinen eigenen Geräten überlassen würde, würde ich eher den XML- Datentyp verwenden, obwohl ich zu der Annahme gelangt bin, dass dies mit Problemen behaftet ist. Das führt mich zu meinen Fragen.
Welche Faktoren sollte ich in diesem Szenario berücksichtigen, wenn ich versuche, zwischen dem Speichern von XML in einer XML- Spalte und einer Varchar- Spalte (MAX) zu entscheiden ?
Wenn es hilft ... hier sind einige zusätzliche Details:
- Es wurde keine Entscheidung bezüglich der Verwendung von Schemata für diese Fragmente ( z. B. XSDs ) getroffen.
- Die Größen der Fragmente reichen von klein bis sehr groß
- Alles XML wird wohlgeformt sein
- Im Laufe eines Tages werden bis zu ~ 10.000 Fragmente mit Online-Abfrageunterstützung gesammelt, die für ~ 3 Monate benötigt werden
- Abfragen gegen XML werden den ganzen Tag über durchgeführt, sollten jedoch bei wenigen gleichzeitigen Abfragen dieses Typs leicht bleiben
sql-server-2008
database-design
schema
datatypes
xml
JoeGeeky
quelle
quelle
<foo></foo>
werden<foo />
Antworten:
Wenn Abfragen gegen XML über die XML-Funktionen des SQL-Servers erfolgen, verwenden Sie den XML-Typ, um eine XML zu speichern und ein Casting zu vermeiden
Und
Beachten Sie, dass der XML-Typ aufgrund der XML-Validierung möglicherweise etwas langsamer gespeichert wird. Der zugrunde liegende XML-Typ ist jedoch normal varbinary (max).
quelle
VARBINARY(MAX)
. Es handelt sich um ein optimiertes Format. Dies bedeutet, dass Sie denXML
Datentyp auch dann verwenden sollten, wenn Sie ihn nicht abfragen .Die Faktoren sind:
XML
Typ kann über XQuery-Ausdrücke abgefragt / analysiert werden, einschließlich der Verwendung von FLWOR-Anweisungen und -IterationenXML
Variablen und Spalten können mithilfe von XQuery-Ausdrücken über XML-DML inline geändert werden .XML
Daten werden als UTF-16 LE (Little Endian) gespeichert, daherVARCHAR(MAX)
wäre dies eine schlechte Wahl, da dies zu Datenverlust führen könnte. Daher ist die wahre Entscheidung sollte sein zwischenXML
undNVARCHAR(MAX)
, daNCHAR
/NVARCHAR
ist auch UTF-16 LE.XML
Daten können gegen eine XSD / validiert werdenXML SCHEMA COLLECTION
. Wenn keine XML-Schemasammlung angegeben ist, wird keine Validierung (außerhalb der Sicherstellung der Form) durchgeführt. Diese Option ist jedoch bei Verwendung nicht verfügbarNVARCHAR(MAX)
.Ein Hauptvorteil des XML-Typs besteht darin, dass er in einem hochoptimierten Format gespeichert ist (nicht
VARBINARY(MAX)
wie in der Antwort von @ Oleg angegeben), in dem nicht die exakte Zeichenfolgendarstellung gespeichert ist, die Sie sehen, sondern ein Wörterbuch mit Element- und Attributnamen und Verweisen zu ihnen durch ihren Ausweis. Außerdem werden Leerzeichen entfernt. Versuche Folgendes:Kehrt zurück:
Wie Sie in der obigen Beispielausgabe sehen können, wurden durch Hinzufügen von vier Elementen (Nr. 3, 4, 5 und 6)
VARCHAR
derNVARCHAR
Variablen 80 Zeichen (daher 80 Byte bei Verwendung ) und 160 Byte hinzugefügt . Es wurden jedoch nur 28 Bytes zur XML-Variablen hinzugefügt, was weniger ist als fürVARCHAR
(nur für den Fall, dass jemand fürVARCHAR
over argumentieren würde,XML
daXML
UTF-16 [meistens] Doppelbyte ist). Diese Optimierung kann viel Platz sparen und ist Grund genug für sich, denXML
Datentyp zu verwenden.quelle