Jenis data untuk menyimpan data XML di: VARCHAR (MAX) atau XML

9

Saya mendefinisikan skema untuk serangkaian sumber daya baru menggunakan SQL Server 2008 ... Dalam hal ini, setiap catatan ( misalnya baris ) perlu menyimpan fragmen XML. Dari waktu ke waktu; meski tidak sering; Saya perlu meminta XML untuk menemukan nilai elemen dan atribut. Jika dibiarkan sendiri, saya akan cenderung menggunakan tipe data xml meskipun saya telah dituntun untuk percaya ini adalah masalah tempa. Jadi itu menuntun saya ke pertanyaan saya.

Dengan skenario ini, faktor-faktor apa yang harus saya mempertimbangkan ketika mencoba untuk memutuskan antara menyimpan XML dalam xml kolom vs varchar (MAX) kolom

Jika itu membantu ... berikut adalah beberapa detail tambahan:

  • Tidak ada keputusan yang dibuat tentang penggunaan skema untuk fragmen ini ( misalnya XSD )
  • Ukuran fragmen akan berkisar dari kecil hingga sangat besar
  • Semua XML akan terbentuk dengan baik
  • Selama sehari, akan ada ~ 10.000 fragmen dikumpulkan dengan dukungan permintaan online yang diperlukan selama ~ 3 bulan
  • Kueri terhadap XML akan terjadi sepanjang hari tetapi harus tetap ringan dengan beberapa kueri bersamaan dari jenis ini
JoeGeeky
sumber
1
Jenis xml tidak menjamin untuk mempertahankan bentuk persis dari xml asli, jika ada persyaratan untuk dokumen tidak berubah maka nvarchar (maks) adalah satu-satunya pilihan.
MartinC
@ MartinC Jika fragmen terbentuk dengan baik, perubahan seperti apa yang dapat terjadi? Saya percaya Anda, saya hanya belum pernah mendengar ini sebelumnya ... Bisakah Anda mengarahkan saya ke beberapa rincian lebih lanjut?
JoeGeeky
Contoh, tag kosong <foo></foo>akan menjadi<foo />
gbn
@ gdn Ahhh, ok ... ini tidak mengubah artinya, jadi tidak masalah dengan saya.
JoeGeeky

Jawaban:

5

Jika kueri terhadap XML akan terjadi oleh kemampuan xml sql server, maka gunakan tipe XML untuk menyimpan xml untuk menghindari casting

Dan

perlu diingat, bahwa tipe XML dapat disimpan sedikit lebih lambat karena validasi xml, tetapi tipe XML yang mendasarinya adalah varbinary biasa (maks)

Oleg Dok
sumber
1
Data yang mendasarinya tidak VARBINARY(MAX). Ini adalah format yang dioptimalkan, yang berarti bahwa bahkan jika Anda tidak akan menanyakannya, Anda masih harus menggunakan XMLtipe data.
Solomon Rutzky
6

faktor apa yang harus saya pertimbangkan ketika mencoba memutuskan antara menyimpan XML dalam xmlkolom vs. varchar(MAX)kolom

Faktor-faktor tersebut adalah:

  1. The XMLjenis adalah queryable / parseable melalui ekspresi XQuery, termasuk mampu menggunakan FLWOR Pernyataan dan Iterasi
  2. Data dalam XMLvariabel dan kolom dapat dimodifikasi sebaris menggunakan ekspresi XQuery melalui XML DML .
  3. XMLdata disimpan sebagai UTF-16 LE (Little Endian), sehingga VARCHAR(MAX)akan menjadi pilihan yang buruk karena dapat mengakibatkan hilangnya data. Oleh karena itu, keputusan sebenarnya harus antara XMLdan NVARCHAR(MAX), mengingat bahwa NCHAR/ NVARCHARini juga UTF-16 LE.
  4. XMLdata dapat divalidasi terhadap XSD / XML SCHEMA COLLECTION. Tidak ada validasi (di luar memastikan pembentukan yang baik) dilakukan jika tidak ada Koleksi Skema XML yang ditentukan, tetapi opsi ini tidak tersedia saat menggunakan NVARCHAR(MAX).
  5. Salah satu manfaat utama dari tipe XML adalah bahwa ia disimpan dalam format yang sangat dioptimalkan (tidak VARBINARY(MAX)seperti yang dinyatakan dalam jawaban @ Oleg) yang tidak menyimpan representasi string yang tepat yang Anda lihat, melainkan memiliki kamus Elemen dan atribut Atribut dan referensi kepada mereka dengan ID mereka. Itu juga menghilangkan spasi. Coba yang berikut ini:

    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];
    

    Pengembalian:

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

    Seperti yang Anda lihat pada contoh output di atas, menambahkan empat elemen (#s 3, 4, 5, dan 6) menambahkan 80 karakter (karenanya 80 byte jika menggunakan VARCHAR) dan 160 byte ke NVARCHARvariabel. Namun, itu hanya menambahkan 28 byte ke variabel XML, yang kurang dari itu ditambahkan untuk VARCHAR(kalau-kalau seseorang akan berdebat mendukung VARCHARlebih XMLkarena XMLUTF-16 yang [kebanyakan] double-byte). Optimalisasi ini dapat menghemat banyak ruang, dan merupakan alasan yang cukup dengan sendirinya untuk menggunakan XMLtipe data.

Solomon Rutzky
sumber