XML डेटा स्टोर करने के लिए कौन सा डेटा टाइप है: VARCHAR (MAX) या XML


9

मैं SQL Server 2008 का उपयोग करते हुए संसाधनों के एक नए सेट के लिए एक स्कीमा को परिभाषित कर रहा हूं ... इस मामले में, प्रत्येक रिकॉर्ड ( उदाहरण के लिए पंक्ति ) को XML टुकड़े संग्रहीत करने की आवश्यकता होगी। समय समय पर; हालांकि अक्सर नहीं; मुझे तत्व और विशेषता मान खोजने के लिए XML को क्वेरी करने की आवश्यकता होगी। यदि मुझे अपने स्वयं के डैविस पर छोड़ दिया जाता है, तो मैं xml डेटा प्रकार का उपयोग करना चाहूंगा, हालांकि मुझे विश्वास है कि यह मुद्दों के साथ गढ़ा हुआ है। तो यह मुझे मेरे सवालों की ओर ले जाता है।

इस परिदृश्य को देखते हुए, XML को xml कॉलम बनाम varchar (MAX) कॉलम के बीच तय करने की कोशिश करते समय मुझे किन कारकों पर विचार करना चाहिए

अगर यह मदद करता है ... यहाँ कुछ अतिरिक्त विवरण हैं:

  • इन अंशों के लिए स्कीमा के उपयोग के बारे में कोई निर्णय नहीं किया गया है ( उदाहरण के लिए XSD )
  • टुकड़ों के आकार छोटे से लेकर बहुत बड़े तक होंगे
  • सभी XML अच्छी तरह से बनेंगे
  • एक दिन में, ~ 3 महीने के लिए आवश्यक ऑनलाइन क्वेरी समर्थन के साथ ~ 10,000 टुकड़े एकत्र किए जाएंगे
  • एक्सएमएल के खिलाफ क्वेरी पूरे दिन होगी, लेकिन इस प्रकार के कुछ समवर्ती प्रश्नों के साथ हल्का रहना चाहिए

1
Xml प्रकार मूल xml के सटीक रूप को संरक्षित करने की गारंटी नहीं देता है, यदि दस्तावेज़ को अपरिवर्तित करने की आवश्यकता है, तो nvarchar (अधिकतम) एकमात्र विकल्प है।
मार्टिन जेएन

@MartinC यदि टुकड़ा पहले से ही सुव्यवस्थित है तो किस तरह का परिवर्तन हो सकता है? मेरा मानना ​​है कि, मैंने पहले यह नहीं सुना है ... क्या आप मुझे कुछ और जानकारी दे सकते हैं?
जोजेकी

उदाहरण, खाली टैग <foo></foo>बन जाएंगे<foo />
gbn

@gdn आह्ह, ठीक है ... यह अर्थ नहीं बदलता है, इसलिए मेरे साथ ठीक है।
जोजेकी

जवाबों:


5

यदि XML के खिलाफ क्वेरी sql सर्वर xml क्षमताओं द्वारा होगी , तो कास्टिंग से बचने के लिए xml को संग्रहीत करने के लिए XML प्रकार का उपयोग करें

तथा

ध्यान रखें, XML प्रकार xml सत्यापन के कारण थोड़ा धीमा संग्रहित किया जा सकता है, लेकिन अंतर्निहित प्रकार का XML साधारण भिन्न (अधिकतम) है


1
अंतर्निहित डेटा नहीं है VARBINARY(MAX)। यह एक अनुकूलित प्रारूप है, जिसका अर्थ है कि भले ही आप इसे क्वेरी नहीं करने जा रहे हैं, फिर भी आपको XMLडेटाटाइप का उपयोग करना चाहिए ।
सोलोमन रटज़की

6

जब एक में भंडारण एक्सएमएल के बीच तय करने की कोशिश कर रहा है कि मैं क्या कारकों पर विचार किया जाना चाहिए xmlएक बनाम स्तंभ varchar(MAX)स्तंभ

कारक हैं:

  1. XMLप्रकार queryable / XQuery भाव के माध्यम से parseable, उपयोग करने के लिए सक्षम किया जा रहा सहित FLWOR वक्तव्य और पुनरावृत्ति
  2. एक्सएमएल डीएमएल केXML माध्यम से XQuery के भावों का उपयोग करके चर और स्तंभों में डेटा को इनलाइन संशोधित किया जा सकता है ।
  3. XMLडेटा को UTF-16 LE (लिटिल एंडियन) के रूप में संग्रहीत किया जाता है, इसलिए VARCHAR(MAX)यह एक खराब विकल्प होगा क्योंकि इससे डेटा हानि हो सकती है। इसलिए, सही निर्णय के बीच और होना चाहिए , यह देखते हुए कि / भी UTF-16 LE है।XMLNVARCHAR(MAX)NCHARNVARCHAR
  4. XMLडेटा को XSD / के खिलाफ मान्य किया जा सकता है XML SCHEMA COLLECTION। यदि कोई XML स्कीमा संग्रह निर्दिष्ट नहीं किया गया है, तो कोई सत्यापन (अच्छी तरह से गठन सुनिश्चित करने के बाहर) किया जाता है, लेकिन उपयोग करते समय यह विकल्प उपलब्ध नहीं है NVARCHAR(MAX)
  5. XML प्रकार का एक प्रमुख लाभ यह है कि यह एक अत्यधिक अनुकूलित प्रारूप में संग्रहीत किया जाता है ( VARBINARY(MAX)जैसा कि @ ओलेग के उत्तर में नहीं कहा गया है) जो आपके द्वारा देखे जाने वाले सटीक स्ट्रिंग प्रतिनिधित्व को संग्रहीत नहीं करता है, बल्कि इसमें एलीमेंट और एट्रीब्यूट नामों का एक शब्द है और संदर्भित करता है उन्हें अपनी आईडी द्वारा। यह व्हाट्सएप को भी दूर करता है। निम्नलिखित का प्रयास करें:

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

    यह दिखाता है:

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

    जैसा कि आप ऊपर दिए गए उदाहरण आउटपुट में देख सकते हैं, चार तत्वों (#s 3, 4, 5, और 6) को जोड़कर 80 वर्णों (इसलिए 80 बाइट्स का उपयोग करते हुए VARCHAR) और 160 बाइट्स NVARCHARचर में जोड़े गए । फिर भी, इसने केवल 28 बाइट्स को XML वैरिएबल में जोड़ा, जो कि इसके लिए कम से कम जोड़ा गया है VARCHAR(सिर्फ अगर कोई व्यक्ति VARCHARओवर के पक्ष में बहस करने जा रहा था XMLक्योंकि XMLUTF-16 है जो [ज्यादातर] डबल-बाइट है)। यह अनुकूलन अंतरिक्ष के टन को बचा सकता है, और XMLडेटाटाइप का उपयोग करने के लिए स्वयं द्वारा पर्याप्त कारण है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.