Definiuję schemat nowego zestawu zasobów za pomocą SQL Server 2008 ... W takim przypadku każdy rekord ( np. Wiersz ) będzie musiał przechowywać fragmenty XML. Od czasu do czasu; chociaż nie często; Będę musiał zapytać XML, aby znaleźć wartości elementu i atrybutu. Gdybym pozostawił to moim własnym pomysłom, zwykle używałbym typu danych xml, chociaż przekonano mnie, że jest to spowodowane problemami. To prowadzi mnie do moich pytań.
Biorąc pod uwagę ten scenariusz, jakie czynniki powinny być brane pod uwagę, że gdy stara się zdecydować między przechowywania XML w xml kolumny vs. varchar (MAX) kolumna
Jeśli to pomaga… oto kilka dodatkowych szczegółów:
- Nie podjęto żadnej decyzji dotyczącej użycia schematów dla tych fragmentów ( np. XSD )
- Rozmiary fragmentów będą wahać się od małych do bardzo dużych
- Wszystkie XML będą dobrze sformułowane
- W ciągu dnia zgromadzonych zostanie do ~ 10 000 fragmentów z obsługą zapytań online potrzebnych przez ~ 3 miesiące
- Kwerendy względem XML będą się pojawiać przez cały dzień, ale powinny pozostać lekkie z kilkoma równoległymi zapytaniami tego typu
sql-server-2008
database-design
schema
datatypes
xml
JoeGeeky
źródło
źródło
<foo></foo>
będą puste tagi<foo />
Odpowiedzi:
Jeśli zapytania dotyczące XML będą się pojawiać dzięki możliwościom xml serwera sql, to użyj typu XML do przechowywania xml, aby uniknąć rzutowania
I
pamiętaj, że typ XML może być przechowywany nieco wolniej z powodu sprawdzania poprawności xml, ale podstawowym typem XML jest zwykły varbinary (maks.)
źródło
VARBINARY(MAX)
. Jest to zoptymalizowany format, co oznacza, że nawet jeśli nie zamierzasz go wyszukiwać, nadal powinieneś używaćXML
typu danych.Czynniki są następujące:
XML
typ jest możliwy do zapytania / analizowania za pomocą wyrażeń XQuery, w tym możliwość korzystania z instrukcji FLWOR i iteracjiXML
zmiennych i kolumnach można modyfikować bezpośrednio za pomocą wyrażeń XQuery za pośrednictwem XML DML .XML
dane są przechowywane jako UTF-16 LE (Little Endian), więcVARCHAR(MAX)
byłby to zły wybór, ponieważ mógłby spowodować utratę danych. Stąd prawdziwa decyzja powinna być pomiędzy,XML
aNVARCHAR(MAX)
biorąc pod uwagę, żeNCHAR
/NVARCHAR
to także UTF-16 LE.XML
dane mogą być sprawdzane pod kątem XSD /XML SCHEMA COLLECTION
. Sprawdzanie poprawności (poza zapewnieniem poprawności) nie jest wykonywane, jeśli nie określono kolekcji schematów XML, ale ta opcja nie jest dostępna podczas używaniaNVARCHAR(MAX)
.Jedną z głównych zalet tego typu XML jest to, że jest przechowywany w wysoce zoptymalizowanym formacie (innym
VARBINARY(MAX)
niż podano w odpowiedzi @ Olega), który nie przechowuje dokładnej reprezentacji ciągu, którą widzisz, ale zamiast tego ma słownik nazw elementów i atrybutów oraz odwołuje się im przez ich identyfikator. Usuwa również białe znaki. Spróbuj wykonać następujące czynności:Zwroty:
Jak widać w powyższym przykładzie wyjściowym, dodanie czterech elementów (# 3, 4, 5 i 6) dodało 80 znaków (stąd 80 bajtów, jeśli jest używane
VARCHAR
) i 160 bajtów doNVARCHAR
zmiennej. Ale to tylko dodaje 28 bajtów do zmiennej XML, który jest mniej niż dodanejVARCHAR
(tylko w przypadku, gdy ktoś jechał przemawiają zaVARCHAR
ponadXML
ponieważXML
jest UTF-16, który jest [przede wszystkim] dwubajtowych). Ta optymalizacja pozwala zaoszczędzić mnóstwo miejsca i sama w sobie jest wystarczającym powodem do użyciaXML
typu danych.źródło