2012-09-17 191 views
1

我有一个很大的XML流,我传递给存储过程,但我得到了一个很长的响应时间几乎1.30分钟的特定部分的XML重复很多。XML花费很长时间解析MSSQL

我检查了执行计划,2个xml结构部分几乎占用了所有的处理时间。我也尝试在插入之前先将它读入2个临时表中,而不是帮助它。 XML的大小是368Kb,所以我有强烈的怀疑,我的xml要么是不可靠的,要么我缺少一些东西来帮助缓解解析。

有没有更好的方式来制定xml,使Xpath()更容易解析?我真的不知道还有什么要做。

的XML的结构是:

<root> 
<someobject> 
<param1></param1> 
<param1></param1> 
</someobject> 
<somethingelse> 
<param1></param1> 
<param1></param1> 
</somethingelse> 
<row1> 
    <param1></param1> 
    <param1></param1> 
    <param1></param1> 
    <param1></param1> 
    <param1></param1> 
    <param1></param1> 
    <param1></param1> 
    <param1></param1> 
</row1> 

查询我目前使用的:

Insert Into [Table] 
Select 
    XmlParam.Doc.value('fieldA[1]','UNIQUEIDENTIFIER') 
,XmlParam.Doc.value('fieldB[1]','UNIQUEIDENTIFIER') 
,XmlParam.Doc.value('fieldC[1]','UNIQUEIDENTIFIER') 
,XmlParam.Doc.value('fieldD[1]','UNIQUEIDENTIFIER') 
,XmlParam.Doc.value('fieldE[1]','UNIQUEIDENTIFIER') 
,XmlParam.Doc.value('fieldF[1]','UNIQUEIDENTIFIER') 
,XmlParam.Doc.value('fieldG[1]','bit') 
,XmlParam.Doc.value('fieldH[1]','bit') 
     From @Xml.nodes('//Flow/StepData') XmlParam(Doc) 

感谢您的帮助!

回答

0

试试这个,对您而言可能会更快。

Select 
    XmlParam.Doc.value('(fieldA/text())[1]','UNIQUEIDENTIFIER') 
    ,XmlParam.Doc.value('(fieldB/text())[1]','UNIQUEIDENTIFIER') 
    ,XmlParam.Doc.value('(fieldC/text())[1]','UNIQUEIDENTIFIER') 
    ,XmlParam.Doc.value('(fieldD/text())[1]','UNIQUEIDENTIFIER') 
    ,XmlParam.Doc.value('(fieldE/text())[1]','UNIQUEIDENTIFIER') 
    ,XmlParam.Doc.value('(fieldF/text())[1]','UNIQUEIDENTIFIER') 
    ,XmlParam.Doc.value('(fieldG/text())[1]','bit') 
    ,XmlParam.Doc.value('(fieldH/text())[1]','bit') 
From @Xml.nodes('//Flow/StepData') XmlParam(Doc) 
+0

这样做的伎俩,执行从1.30分钟减少到6秒。 /text()将它指向最终节点,没有它,它指向整个元素。再次感谢!只有在你的回答结束后,我才能找到关于它的帖子:[link](http://milambda.blogspot.com/2007/02/sql-server-2005-xml-methods-part-three.html) – qminator