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
sql-server-2008
database-design
schema
datatypes
xml
JoeGeeky
sumber
sumber
<foo></foo>
akan menjadi<foo />
Jawaban:
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)
sumber
VARBINARY(MAX)
. Ini adalah format yang dioptimalkan, yang berarti bahwa bahkan jika Anda tidak akan menanyakannya, Anda masih harus menggunakanXML
tipe data.Faktor-faktor tersebut adalah:
XML
jenis adalah queryable / parseable melalui ekspresi XQuery, termasuk mampu menggunakan FLWOR Pernyataan dan IterasiXML
variabel dan kolom dapat dimodifikasi sebaris menggunakan ekspresi XQuery melalui XML DML .XML
data disimpan sebagai UTF-16 LE (Little Endian), sehinggaVARCHAR(MAX)
akan menjadi pilihan yang buruk karena dapat mengakibatkan hilangnya data. Oleh karena itu, keputusan sebenarnya harus antaraXML
danNVARCHAR(MAX)
, mengingat bahwaNCHAR
/NVARCHAR
ini juga UTF-16 LE.XML
data 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 menggunakanNVARCHAR(MAX)
.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:Pengembalian:
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 keNVARCHAR
variabel. Namun, itu hanya menambahkan 28 byte ke variabel XML, yang kurang dari itu ditambahkan untukVARCHAR
(kalau-kalau seseorang akan berdebat mendukungVARCHAR
lebihXML
karenaXML
UTF-16 yang [kebanyakan] double-byte). Optimalisasi ini dapat menghemat banyak ruang, dan merupakan alasan yang cukup dengan sendirinya untuk menggunakanXML
tipe data.sumber