दिलचस्प पोस्ट
स्विफ्ट 3 में कहां प्रेषण करें? JFormattedTextField ठीक से साफ नहीं है एएसपी.नेट वेबसर्विसे के साथ आईफोन की बातचीत PHP – नियमित अभिव्यक्ति – PCRE \ l, \ l, \ N, \ P का समर्थन नहीं करता है, Xcode 4 – निर्गम निर्देशिका का निर्माण सी में मेरी सरणी के आकार को मैं कैसे निर्धारित करूं? NSXMLParser उदाहरण जावा hashmap में एक कुंजी को दिया गया मूल्य कैसे अपडेट करें? SQL सर्वर "टेक्स्ट" डेटा प्रकार पर WHERE खंड एक्सआई: स्कीमा स्थान का उपयोग क्या है? क्रोम पर फ्लोटिंग पॉइंट नंबर के लिए एचटीएमएल 5 इनपुट टाइप = "नंबर" तत्व विम: ओएस एक्स क्लिपबोर्ड को कॉपी चयन क्या मैक पर "वॉच" या "इनॉटिफाइवेट" जैसी कोई आज्ञा है? किस बिंदु पर `के लिए` या `के लिए / आर` निर्देशिका (वृक्ष) की गणना करता है? पायथन अनुरोध मॉड्यूल को छोड़कर / कोशिश करने का सही तरीका है?

एसक्यूएल सर्वर डाटाबेस कॉलम में एक्सएमएल डाटा को खराब करने का सबसे अच्छा तरीका

विभिन्न डाटाबेस कॉलम में एक्सएमएल डाटा को खराब करने का सबसे अच्छा तरीका क्या है? अब तक मैं मुख्य रूप से नोड्स और वैल्यू फ़ंक्शन का उपयोग कर रहा हूं।

INSERT INTO some_table (column1, column2, column3) SELECT Rows.n.value('(@column1)[1]', 'varchar(20)'), Rows.n.value('(@column2)[1]', 'nvarchar(100)'), Rows.n.value('(@column3)[1]', 'int'), FROM @xml.nodes('//Rows') Rows(n) 

हालांकि मुझे लगता है कि यह भी मध्यम आकार के xml डेटा के लिए बहुत धीमा हो रहा है

Solutions Collecting From Web of "एसक्यूएल सर्वर डाटाबेस कॉलम में एक्सएमएल डाटा को खराब करने का सबसे अच्छा तरीका"

एक बहुत ही इसी तरह की समस्या होने के दौरान इस सवाल पर ठोकर खाई, मैं लगभग 3.5 ~ 4 घंटों के लिए 7.5 एमएम एक्सएमएल फ़ाइल (लगभग 10,000 नोड्स) पर एक क्वेरी प्रसंस्करण चला रहा था।

हालांकि, थोड़े अधिक शोध के बाद मैंने पाया कि एक्सएमएल एक स्कीमा का उपयोग कर टाइप किया है और एक एक्सएमएल इंडेक्स बनाया है (मैं बल्क को एक टेबल में डाला था) वही प्रश्न ~ 0.04 एम में पूरा हुआ

प्रदर्शन सुधार के लिए यह कैसा है!

एक स्कीमा बनाने के लिए कोड:

 IF EXISTS ( SELECT * FROM sys.xml_schema_collections where [name] = 'MyXmlSchema') DROP XML SCHEMA COLLECTION [MyXmlSchema] GO DECLARE @MySchema XML SET @MySchema = ( SELECT * FROM OPENROWSET ( BULK 'C:\Path\To\Schema\MySchema.xsd', SINGLE_CLOB ) AS xmlData ) CREATE XML SCHEMA COLLECTION [MyXmlSchema] AS @MySchema GO 

एक टाइप किए गए XML कॉलम के साथ तालिका बनाने के लिए कोड:

 CREATE TABLE [dbo].[XmlFiles] ( [Id] [uniqueidentifier] NOT NULL, -- Data from CV element [Data] xml(CONTENT dbo.[MyXmlSchema]) NOT NULL, CONSTRAINT [PK_XmlFiles] PRIMARY KEY NONCLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] 

सूचकांक बनाने के लिए कोड

 CREATE PRIMARY XML INDEX PXML_Data ON [dbo].[XmlFiles] (Data) 

हालांकि कुछ बातों को ध्यान में रखना है स्कीमा के SQL सर्वर के कार्यान्वयन xsd का समर्थन नहीं करता है: शामिल करें। इसका मतलब यह है कि यदि आपके पास स्कीमा है जो अन्य स्कीमा का संदर्भ देता है, तो आपको इन सभी को एक स्कीमा में कॉपी करना होगा और उसे जोड़ना होगा

इसके अलावा मुझे एक त्रुटि मिलती है:

 XQuery [dbo.XmlFiles.Data.value()]: Cannot implicitly atomize or apply 'fn:data()' to complex content elements, found type 'xs:anyType' within inferred type 'element({http://www.mynamespace.fake/schemas}:SequenceNumber,xs:anyType) ?'. 

अगर मैंने नोड के ऊपर नेविगेट करने की कोशिश की तो मैंने नोड्स फ़ंक्शन के साथ चयन किया था। उदाहरण के लिए

 SELECT ,C.value('CVElementId[1]', 'INT') AS [CVElementId] ,C.value('../SequenceNumber[1]', 'INT') AS [Level] FROM [dbo].[XmlFiles] CROSS APPLY [Data].nodes('/CVSet/Level/CVElement') AS T(C) 

यह पाया गया कि यह संभाल करने का सबसे अच्छा तरीका है, बाहरी प्रोग्राम को एक्सएमएल पर एक "बाहरी जॉइन" करने के लिए बाहरी एप्लीकली का इस्तेमाल करना।

 SELECT ,C.value('CVElementId[1]', 'INT') AS [CVElementId] ,B.value('SequenceNumber[1]', 'INT') AS [Level] FROM [dbo].[XmlFiles] CROSS APPLY [Data].nodes('/CVSet/Level') AS T(B) OUTER APPLY B.nodes ('CVElement') AS S(C) 

आशा है कि किसी को मदद करता है क्योंकि यह मेरे दिन बहुत अधिक रहा है

मेरे मामले में मैं SQL 2005 SP2 (9.0) चल रहा हूं।

केवल एक चीज जो ऑप्टिफिकेशन (ऑप्टिमाइज़ फॉर (@Your_xml_var = NULL)) को जोड़ने में मदद करती थी। स्पष्टीकरण नीचे दिए गए लिंक पर है।

उदाहरण:

 INSERT INTO @tbl (Tbl_ID, Name, Value, ParamData) SELECT 1, tbl.cols.value('name[1]', 'nvarchar(255)'), tbl.cols.value('value[1]', 'nvarchar(255)'), tbl.cols.query('./paramdata[1]') FROM @xml.nodes('//root') as tbl(cols) OPTION ( OPTIMIZE FOR ( @xml = NULL ) ) 

https://connect.microsoft.com/SQLServer/feedback/details/562092/an-insert-statement-using-xml-nodes-is-very-very-very-slow-in-sql2008-sp1

मुझे यकीन नहीं है कि सबसे अच्छा तरीका क्या है मैंने ओपनएक्सएमएल निर्माण का इस्तेमाल किया:

 INSERT INTO Test SELECT Id, Data FROM OPENXML (@XmlDocument, '/Root/blah',2) WITH (Id int '@ID', Data varchar(10) '@DATA') 

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

हमारे यहां एक समान समस्या थी। हमारे डीबीए (एसपी, आप आदमी) ने मेरे कोड पर एक नज़र डाला, वाक्यविन्यास के लिए थोड़ा सा बदलाव किया, और हमें उस गति की उम्मीद है जो हम उम्मीद कर रहे थे। यह असामान्य था क्योंकि एक्सएमएल से मेरा चयन काफी तेज़ था, लेकिन डालने का तरीका धीमा था तो इसके बजाय इस वाक्य रचना का प्रयास करें:

 INSERT INTO some_table (column1, column2, column3) SELECT Rows.n.value(N'(@column1/text())[1]', 'varchar(20)'), Rows.n.value(N'(@column2/text())[1]', 'nvarchar(100)'), Rows.n.value(N'(@column3/text())[1]', 'int') FROM @xml.nodes('//Rows') Rows(n) 

इसलिए पाठ () पैरामीटर को निर्दिष्ट करना वास्तव में प्रदर्शन में अंतर करना लगता है हमारे 2K पंक्तियों में से सम्मिलित हुए 'मैंने गलत लिखा है – मुझे इसे रोकना चाहिए' से करीब 3 सेकंड तक। जो कनेक्शन के माध्यम से हम चल रहे कच्चे सम्मिलित बयान से 2x तेज थे।

मैं यह "सबसे अच्छा" समाधान का दावा नहीं करता, लेकिन मैंने इस सटीक उद्देश्य के लिए एक सामान्य एसक्यूएल सीएलआर प्रक्रिया लिखा है – यह एक "सारणीबद्ध" एक्सएमएल संरचना (जैसे कि XML आरएए के लिए वापस आती है) लेती है और एक परिणामस्वरूप आउटपुट करती है ।

एक्सएमएल में "टेबल" के ढांचे के किसी भी अनुकूलन / ज्ञान की आवश्यकता नहीं है, और बेहद तेज / कुशल होने के लिए निकला (हालांकि यह डिज़ाइन लक्ष्य नहीं था)। मैंने सिर्फ 20 एमबी (untyped) XML वैरिएबल को 20 सेकंड के भीतर कटा हुआ, एक बहुत विस्तृत तालिका के 25,000 पंक्तियों को वापस लौटाया

उम्मीद है कि यह किसी को मदद करता है: http://architectshack.com/Cl2xmlShredder.ashx

यह एक जवाब नहीं है, और इस सवाल का एक अतिरिक्त है- मैं सिर्फ एक ही समस्या में आया हूं और मैं आंकड़े बता सकता हूं जैसे कि ईडीजी टिप्पणी में पूछता है।

मेरे परीक्षण में एक्सएमएल है, जो 244 अभिलेखों को सम्मिलित करता है – इसलिए 244 नोड्स

कोड जिसे मैं पुनः लिख रहा हूं वह औसत 0.4 सेकेंड पर चलता है। (10 टेस्ट रन रन .56 सेकंड से .344 सेकेंड तक फैलते हैं) प्रदर्शन का मुख्य कारण कोड को फिर से लिखना नहीं है, लेकिन नया कोड भी प्रदर्शन करना होगा या और अच्छा। यह पुराना कोड एक्सएमएल नोड्स को छीनता है, प्रति लूप प्रति एक बार सम्मिलित करने के लिए एक सपा कॉल करता है

नया कोड बहुत ज्यादा बस एक एकल एसपी है; XML को पास करें; इसके टुकड़ें करें।

नए कोड के साथ परीक्षण दिखाता है कि नया एसपी औसत 3.7 सेकंड लेता है – लगभग 10 गुना धीमा।

मेरी प्रश्न इस प्रश्न में पोस्ट किए गए फॉर्म में है;

 INSERT INTO some_table (column1, column2, column3) SELECT Rows.n.value('(@column1)[1]', 'varchar(20)'), Rows.n.value('(@column2)[1]', 'nvarchar(100)'), Rows.n.value('(@column3)[1]', 'int'), FROM @xml.nodes('//Rows') Rows(n) 

निष्पादन योजना यह दिखाती है कि प्रत्येक कॉलम के लिए, एसक्यूएल सर्वर एक अलग "टेबल वैल्यूड फ़ंक्शन [XMLReader]" कर रहा है, जिसमें सभी 244 पंक्तियाँ लौटाई जाती हैं, जो नेस्टेड लूप (इनर जॉइन) के साथ सभी बैक अप में शामिल हो जाती है। तो मेरे मामले में जहां से मैं लगभग 30 कॉलमों में कटौती / सम्मिलित हूं, यह 30 बार अलग-अलग होने लगता है

मैं इस कोड को डंप करने जा रहा हूं, मुझे नहीं लगता कि इस पद्धति पर स्वाभाविक रूप से धीमी गति से कोई ऑप्टिमाइज़ेशन प्राप्त करने वाला है। मैं sp_xml_prepared document / OPENXML पद्धति का प्रयास करने जा रहा हूं और देखें कि उसके लिए प्रदर्शन बेहतर है या नहीं। यदि किसी व्यक्ति को वेब खोज से इस प्रश्न पर आता है (जैसा कि मैंने किया था) मैं आपको SQL सर्वर में इस तरह के कचरे का उपयोग करने से पहले कुछ निष्पादन परीक्षण करने के लिए अत्यधिक सलाह देगा

एक XML बल्क लोड COM ऑब्जेक्ट ( .NET उदाहरण ) है

एमएसडीएन से :

आप किसी INSERT कथन और OPENXML फ़ंक्शन का उपयोग कर SQL डेटा डेटाबेस में XML डेटा सम्मिलित कर सकते हैं; हालांकि, बल्क लोड उपयोगिता को बेहतर प्रदर्शन प्रदान करता है जब आपको बड़ी मात्रा में XML डेटा सम्मिलित करने की आवश्यकता होती है

बड़े एक्सएमएल सेट (> 500 नोड्स) के लिए मेरा मौजूदा समाधान XML बल्क कॉपी (System.Data.SqlClient.SqlBulkCopy) का उपयोग करने के लिए XML में XML को लोड करने के लिए एक डाटासेट का उपयोग करना है और फिर तालिका को SqlBulkCopy (एक XML स्कीमा को परिभाषित करने में मदद करता है )।

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

असल में मुझे अपने मूल प्रश्न का कोई समाधान नहीं मिला, उस प्रकार के एक्सएमएल कतरन के लिए धीमी प्रदर्शन के बारे में। यह लिखित एक्सएमएल प्रश्नों के कारण धीमी गति से हो सकता है या लेनदेन के साथ कुछ और धीमा हो सकता है और SQL सर्वर लॉग मुझे लगता है कि टाइप किए गए xml फ़ंक्शंस को कभी भी नॉन-तुच्छ नोड आकारों पर काम करने के लिए डिज़ाइन नहीं किया गया था।

XML बल्क लोड: मैंने इसे करने की कोशिश की और यह तेज़ था, लेकिन मुझे कॉम डीएल को 64 बिट के वातावरण के तहत काम करने में परेशानी हो रही थी और मैं आम तौर पर उन कॉम डीएलएस से बचने का प्रयास करता हूं जो अब समर्थित नहीं हैं।

sp_xml_preparedocument / OPENXML: मैं कभी भी इस सड़क से नीचे नहीं गया था इसलिए यह देखने के लिए दिलचस्पी होगी कि यह कैसा प्रदर्शन करता है।