2013-08-15 5 views
6

हम गुण एक भी एक्सएमएल नोड XML पार्सर दुर्घटनाओं से पहले हो सकता है की अधिकतम संख्या पर एसक्यूएल सर्वर 2008 में दीवार से टकरा गए हैं।एसक्यूएल सर्वर 2008 त्रुटि - XML ​​पार्सिंग: दस्तावेज़ पार्स आवश्यक बहुत अधिक स्मृति

त्रुटि हम प्राप्त कर रहे हैं है:

Msg 6303, Level 16, State 1, Line 1 
XML parsing: Document parsing required too much memory 

कौन सा एक छोटे से भ्रामक है। स्ट्रिंग को किसी XML डेटा प्रकार (या तालिका कॉलम) में कनवर्ट करते समय समस्या हो रही है।

SELECT CONVERT(XML, '<DataNode><Data attr1="a" attr2="b" XXXXX /></DataNode>') 

कहाँ XXXXX वास्तव में एक और 8191 गुण है।

कुल में हमारे डाटासेट 10,066 विशेषताओं के साथ शुरू करने के लिए होता है। जब हम गुणों की संख्या को 8,192 तक कम करते हैं, तो यह ठीक काम करता है। हालांकि 8,193 गुण दुर्घटनाग्रस्त हो जाते हैं।

यह कुछ भी करने के लिए विशेष रूप से डेटा का आकार से कोई लेना देना नहीं लगता है -

तो, है (100 एमबी या 60KB यह कोई बात नहीं हम एक ही असफल/सफलता विशेषता गणना के आधार पर मिलता है) इस सीमा को बदलने के लिए एसक्यूएल सर्वर के साथ कुछ भी किया जा सकता है?

हमारी सी # आवेदन इस सीमा नहीं है तो सी # में पूरी तरह से वैध एक्सएमएल दस्तावेजों एसक्यूएल सर्वर के XML डेटा स्तंभों में जमा नहीं किया जा सकता है।

कोई भी मदद जो कोई भी पेशकश कर सकता है उसकी सराहना की जाएगी। डेटा-स्ट्रक्चर को इस बिंदु पर बदला नहीं जा सकता है क्योंकि इसे सैकड़ों घटकों के साथ एक संपूर्ण अनुप्रयोग ढांचे की डेटा प्रोसेसिंग कार्यक्षमता के पुन: लिखने की आवश्यकता होगी।

पुनश्च: मैं पहले से ही कैसे हास्यास्पद स्थिति है के प्रबंधन की सलाह दी एक एकल नोड के बजाय एक पेड़ के रूप में विशेषताओं के रूप में एक आवेदन भंडार डेटा, लेकिन यह मैं क्या के साथ काम करने के लिए है जब :-(

संपादित: हम एसक्यूएल सर्वर पर इस की कोशिश की है 2GB RAM के साथ एक सर्वर और 32GB राम के साथ एक सर्वर पर 2008 32 और 64-बिट संस्करण - सभी संस्करणों और वातावरण में एक ही मुद्दा है

अद्यतन:

मैंने trie किया है यह SQL सर्वर 2012 में है, और यह विफल रहता है जब 8,193 विशेषताएँ होती हैं और स्ट्रिंग की लंबाई किसी दिए गए आकार (परीक्षण स्ट्रिंग की लंबाई 833K) पर भी होती है, लेकिन जब समान लंबाई स्ट्रिंग में केवल 8,192 गुण होते हैं तो काम करता है।

हालांकि मैं 12,000 विशेषताओं के साथ एक बहुत छोटे स्ट्रिंग (193K) है और यह एसक्यूएल सर्वर 2012 में काम करता है, और SQL सर्वर 2008)

इसलिए, यह विशेषताओं की संख्या का एक संयोजन हो गया लगता है जब स्ट्रिंग कास्ट एक निश्चित आकार से अधिक है। यह और अधिक रोचक हो जाता है!

अभी तक फीडबैक के लिए धन्यवाद!

अद्यतन 2:

छोटे तार (270k) मैं अभी भी 16,384 से विशेषता सीमा तक नहीं पहुंच के साथ आगे के परीक्षण के बाद ... 16,385 विशेषताओं में विफल रहता है! तो, स्ट्रिंग लंबाई के संयोजन के आधार पर यह निश्चित रूप से 8 के गुणों की वृद्धि में हो रहा है !!

+1

आप सी # आवेदन करने के लिए सिर्फ एक varchar (max) वापसी कर सके और एप्लिकेशन उचित XML स्वरूप में परिवर्तित करते देखा है? – Tim

+0

दुर्भाग्यवश समस्या सी # के साथ नहीं है, हम XML सर्वर में एक्सएमएल कॉलम में एक्सएमएल डालने की कोशिश कर रहे हैं और यह त्रुटि प्राप्त करने की कोशिश कर रहे गुणों की संख्या के कारण यह त्रुटि प्राप्त कर रहे हैं। सी # में यह 8,192 विशेषता सीमा नहीं है जो SQL सर्वर का एक्सएमएल पार्स है। – doublehelix

+0

आह - मुझे गलत समझा गया। क्षमा करें :( – Tim

उत्तर

2

8191 विशेषताएँ बहुत अधिक लगता है। यदि ऐसा लगता है कि आप विशेषताओं में वास्तविक डेटा स्टोर करने का प्रयास कर रहे हैं - जाहिर है SQL सर्वर पार्सर की सीमा यहां है।

देखने लेख यहाँ: http://blogs.msdn.com/b/sqlprogrammability/archive/2006/05/23/605299.aspx?Redirected=true

एक प्रकार सत्यापन के लिए आवश्यक होता है, तो सत्यापनकर्ता अपने परिभाषा मेटाडाटा से लोड करता है और त्वरित सत्यापन के लिए उपयुक्त एक प्रारूप में यह संकलित करता है। किसी भी प्रकार को मेमोरी का उपयोग करने से रोकने के लिए, SQL सर्वर एक मेगाबाइट पर संकलित प्रकार के आकार को कैप्स करता है। SQL सर्वर सभी प्रकारों को संकलित करता है और इस चेक को निष्पादित करता है जब स्कीमा आयात सीमा को पार करने वाले प्रकारों को स्वीकार करने से बचने के लिए आयात किया जाता है।

मैं आपको XML का उपयोग करने के तरीके को बदलने और तत्व के अंदर जानकारी संग्रहीत करने का सुझाव दूंगा।

http://www.ibm.com/developerworks/library/x-eleatt/index.html और http://www.w3schools.com/xml/xml_attributes.asp

+0

अरे @AlexThe डेवलपर, प्रतिक्रिया के लिए धन्यवाद। हमने अतीत में इन सीमाओं को देखा है और गहराई की सीमाओं के बारे में जानते हैं और हम xsd का उपयोग नहीं करते हैं क्योंकि हमारे पास रिकॉर्ड प्रकार प्रति गतिशील डेटा संरचना है। डेटा को स्टोर करने के लिए यह निश्चित रूप से एक बुरा तरीका है, और अवसर दिया गया है कि मैं पूरी सोच को पूरी तरह से फिर से लिखना चाहूंगा, हालांकि स्कीमा अभी के लिए रहने के लिए है क्योंकि यह उत्पाद 7 साल पुराना है और इसमें दर्जनों सर्वरों पर अरबों रिकॉर्ड हैं ग्राहक बुनियादी ढांचे। ऐसा लगता है कि हम आंतरिक एक्सएमएल डेटा प्रकार को मिट रहे हैं और एक्सएमएल/एक्सपीएथ कार्यक्षमता को इसके बजाय सी # लेयर पर ले जा रहे हैं ... धन्यवाद! – doublehelix

संबंधित मुद्दे