In welchem ​​Datentyp sollen XML-Daten gespeichert werden: VARCHAR (MAX) oder XML


9

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

1
Der XML-Typ garantiert nicht, dass die exakte Form der ursprünglichen XML beibehalten wird. Wenn das Dokument unverändert bleiben muss, ist nvarchar (max) die einzige Option.
MartinC

@MartinC Wenn das Fragment bereits gut geformt ist, welche Art von Änderung könnte auftreten? Ich glaube dir, ich habe das noch nie gehört ... Kannst du mich auf weitere Details hinweisen?
JoeGeeky

Beispiel, leere Tags <foo></foo>werden<foo />
gbn

@gdn Ahhh, ok ... das ändert nichts an der Bedeutung, also ist das ok für mich.
JoeGeeky

Antworten:


5

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).


1
Die zugrunde liegenden Daten sind nicht VARBINARY(MAX). Es handelt sich um ein optimiertes Format. Dies bedeutet, dass Sie den XMLDatentyp auch dann verwenden sollten, wenn Sie ihn nicht abfragen .
Solomon Rutzky

6

Welche Faktoren sollte ich berücksichtigen, wenn ich versuche, zwischen dem Speichern von XML in einer xmlSpalte und einer varchar(MAX)Spalte zu entscheiden?

Die Faktoren sind:

  1. Der XMLTyp kann über XQuery-Ausdrücke abgefragt / analysiert werden, einschließlich der Verwendung von FLWOR-Anweisungen und -Iterationen
  2. Daten in XMLVariablen und Spalten können mithilfe von XQuery-Ausdrücken über XML-DML inline geändert werden .
  3. XMLDaten werden als UTF-16 LE (Little Endian) gespeichert, daher VARCHAR(MAX)wäre dies eine schlechte Wahl, da dies zu Datenverlust führen könnte. Daher ist die wahre Entscheidung sollte sein zwischen XMLund NVARCHAR(MAX), da NCHAR/ NVARCHARist auch UTF-16 LE.
  4. XMLDaten können gegen eine XSD / validiert werden XML 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ügbar NVARCHAR(MAX).
  5. 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:

    DECLARE @Test1 XML = N'<Test><TagName>1</TagName><TagName>2</TagName></Test>';
    
    DECLARE @String1 NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];
    
    SET @Test1 = N'<Test><TagName>1</TagName><TagName>2</TagName><TagName>3</TagName>
    <TagName>4</TagName><TagName>5</TagName><TagName>6</TagName></Test>';
    
    SET @String1 = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];
    

    Kehrt zurück:

    XmlBytes   StringCharacters   StringBytes
    56         53                 106
    
    XmlBytes   StringCharacters   StringBytes
    84         133                266
    

    Wie Sie in der obigen Beispielausgabe sehen können, wurden durch Hinzufügen von vier Elementen (Nr. 3, 4, 5 und 6) VARCHARder NVARCHARVariablen 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ür VARCHAR(nur für den Fall, dass jemand für VARCHARover argumentieren würde, XMLda XMLUTF-16 [meistens] Doppelbyte ist). Diese Optimierung kann viel Platz sparen und ist Grund genug für sich, den XMLDatentyp zu verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.