XML verilerini depolamak için hangi veri türü: VARCHAR (MAX) veya XML


9

SQL Server 2008 kullanarak yeni bir kaynak kümesi için bir şema tanımlıyorum ... Bu durumda, her kayıt ( örneğin satır ) XML parçaları depolamak gerekir. Zamandan zamana; sık olmamasına rağmen; Öğe ve nitelik değerlerini bulmak için XML'i sorgulamam gerekecek. Kendi cihazım için bırakılırsa, ben bu sorunları ile dövme olduğuna inanmak için yönlendirildi rağmen xml veri türünü kullanmak eğiliminde olacaktır . Bu da beni sorularıma götürüyor.

Bu senaryo göz önüne alındığında, bir xml sütununda bir varchar (MAX) sütununa XML saklama arasında karar vermeye çalışırken hangi faktörleri göz önünde bulundurmalıyım?

Eğer yardımcı olursa… işte bazı ek ayrıntılar:

  • Bu fragmanlar için şemaların kullanımına ilişkin herhangi bir karar alınmamıştır ( örn. XSD'ler )
  • Parçaların boyutları küçükten çok büyüğe kadar değişecektir
  • Tüm XML iyi biçimlendirilmiş olacak
  • Bir gün boyunca, ~ 3 ay boyunca gerekli çevrimiçi sorgu desteği ile ~ 10.000'e kadar parça toplanacak
  • XML'e karşı sorgular gün boyunca gerçekleşecek, ancak bu türden birkaç eşzamanlı sorgu ile hafif kalmalıdır

1
Xml türü, orijinal xml'in tam biçimini korumayı garanti etmez, belgenin değişmesi için bir gereksinim varsa, nvarchar (max) tek seçenektir.
MartinC

@MartinC Eğer parça iyi biçimlendirilmişse ne tür bir değişiklik olabilir? Sana inanıyorum, bunu daha önce duymadım ... Beni biraz daha ayrıntıya yönlendirebilir misin?
JoeGeeky

Örnek, boş etiketler<foo></foo><foo />
gbn

@gdn Ahhh, tamam ... bu anlamını değiştirmez, bu yüzden benim için sorun değil.
JoeGeeky

Yanıtlar:


5

Eğer XML karşı sorgular olacak SQL Server xml yetenekleri ile, daha sonra önlemek döküm için bir xml depolamak için XML türü kullanmak

Ve

XML türünün xml doğrulaması nedeniyle biraz daha yavaş depolanabileceğini, ancak alttaki XML türünün sıradan değişken olduğunu unutmayın (maks)


1
Temel veriler değildir VARBINARY(MAX). Bu optimize edilmiş bir biçimdir, yani sorgulamayacak olsanız bile yine de XMLveri türünü kullanmanız gerekir .
Solomon Rutzky

6

XML'i bir xmlsütunda ve bir varchar(MAX)sütunda saklama arasında karar vermeye çalışırken hangi faktörleri göz önünde bulundurmalıyım?

Faktörler:

  1. XMLTip kullanabilme dahil sorgulanabilir / XQuery ifadeler yoluyla ayrıştırılabilir olduğu FLWOR Bildirimi ve Yineleme
  2. XMLDeğişkenler ve sütunlardaki veriler XML DML aracılığıyla XQuery ifadeleri kullanılarak satır içi olarak değiştirilebilir .
  3. XMLveriler UTF-16 LE (Little Endian) olarak saklanır, bu nedenle VARCHAR(MAX)veri kaybına neden olabileceğinden kötü bir seçim olacaktır. Bu nedenle, doğru karar olmalıdır arasında XMLve NVARCHAR(MAX)göz önüne alındığında, NCHAR/ NVARCHARUTF-16 LE.
  4. XMLVeri olabilir bir XSD / 'karşı doğrulanabilir XML SCHEMA COLLECTION. Hiçbir XML Şeması Koleksiyonu belirtilmezse doğrulama (düzgün biçimlendirme sağlama dışında) yapılmaz, ancak bu seçenek kullanılırken kullanılamaz NVARCHAR(MAX).
  5. XML türünün önemli bir yararı, VARBINARY(MAX)gördüğünüz tam dize temsilini saklamayan ancak bunun yerine Öğe ve Öznitelik adlarının sözlüğüne sahip olduğu ve başvuruda bulunduğu yüksek düzeyde optimize edilmiş bir biçimde ( @ Oleg yanıtında belirtildiği gibi değil) depolanmasıdır. kimliklerine göre onlara. Boşluğu da kaldırır. Takip etmeyi dene:

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

    İadeler:

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

    Yukarıdaki örnek çıktıda da görebileceğiniz gibi, dört öğe (#s 3, 4, 5 ve 6) eklenmesi değişkene 80 karakter (dolayısıyla kullanılıyorsa 80 bayt VARCHAR) ve 160 bayt ekledi NVARCHAR. Ancak bu sadece bir XML değişkeni, 28 bayt eklenen az onun için eklenen daha VARCHAR(her ihtimale karşı birileri lehine iddia gidiyordu VARCHARüzerinde XMLçünkü XMLUTF-16 [çoğunlukla] çift bayt olduğunu). Bu optimizasyon tonlarca yerden tasarruf edebilir ve XMLveri tipini kullanmak için tek başına yeterli bir nedendir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.