एक ही समस्या होने के दौरान इस प्रश्न में ठोकर खाई, मैं आखिरकार छोड़ने से पहले लगभग 3.5 ~ 4 घंटे के लिए एक 7.5 एमबी एक्सएमएल फ़ाइल (~ लगभग 10,000 नोड्स) प्रसंस्करण कर रहा था।
हालांकि, थोड़ा और शोध के बाद मैंने पाया कि एक स्कीमा का उपयोग करके एक्सएमएल टाइप किया है और एक एक्सएमएल इंडेक्स (मैं एक टेबल में थोक डाला गया था) बनाया है, वही क्वेरी ~ 0.04ms में पूरी हुई है।
प्रदर्शन सुधार के लिए यह कैसा है! सूचकांक बनाने के लिए
CREATE PRIMARY XML INDEX PXML_Data
ON [dbo].[XmlFiles] (Data)
वहाँ कुछ ही रहे हैं
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]
कोड: एक टाइप एक्सएमएल स्तंभ के साथ तालिका बनाने के लिए
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
कोड:
कोड एक स्कीमा बनाने के लिए चीजों को ध्यान में रखना हालांकि। स्कीमा का 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)
आशा है कि इससे किसी को भी मदद मिलेगी क्योंकि यह मेरा दिन बहुत सुंदर रहा है।
हो सकता है कि यदि आप "मध्यम आकार" और वास्तविक संख्या के साथ "धीमी" मात्रा निर्धारित तो लोगों को बेहतर सलाह देने के लिए सक्षम हो जाएगा? –
मॉडरेट> 300 - 500 नोड्स एक बार – eddiegroves