虽然遇到了一个非常类似的问题,但遇到了一个处理7.5MB XML文件(大约10,000个节点)的查询,大概花了3.5〜4个小时,最终放弃了。但是,经过多一点研究后,我发现使用模式键入XML并创建了XML索引(我将批量插入到表中),同一查询在〜0.04ms内完成。
这对于性能改进如何?
代码来创建一个模式:
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 Server的Schema实现不支持xsd:include。这意味着如果你有一个引用其他模式的模式,你必须将所有这些模式复制到一个模式中并添加它。
而且我会得到一个错误:
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)
发现处理此问题的最佳方法是使用OUTER APPLY实际上在XML上执行“外连接”。
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)
希望这可以帮助别人作为这几乎是我的一天。
也许如果你量化“规模适中”和“慢”与实际数字那么人们将能够更好的建议? – 2008-09-14 09:57:55
中等> 300 - 500个节点一次 – eddiegroves 2009-03-10 19:19:33