我正在使用NOAA的当前观察XML (例如:华盛顿特区),并将4000+站点的文件分解到Server 2008 R2表中。在尝试了许多不同的方法之后,我有了一种正在前进的方法。
这个问题是关于不同方法之间的性能问题,最重要的是为什么它如此激烈。
第一次尝试
在C#中工作,我解析了所有使用Linq到XML的文件,并用Linq到SQL将结果记录写入数据库。这方面的代码是可预测的,所以我不会让你感到厌烦。
用linq重写到实体框架没有帮助。
这导致应用程序运行了一个多小时,并且只处理了大约1600个文件。慢度是Linq到SQL和Linq对执行insert和select的实体执行每条记录的结果。
第二次尝试
仍然在C#中工作,我试图通过使用联机可用的批量插入方法(例如:使用Linq-to-SQL加速插入-第1部分)来加快速度。
虽然明显快于第一次尝试,但仍然缓慢。
此时,我开始使用存储过程来处理XML分解,并使用C#代码插入文件,将文件连接到一个XML中,并添加一个包装器标记。
第三次尝试
从内存中使用与此类似的SQL Server XML查询(@xml是xml文件)
select credit = T.observation.value('credit[1]', 'varchar(256)')
,... -- the rest of the elements possible in the file.
from @xml.nodes('wrapper') W(station)
cross apply W.station.nodes('current_observation') T(observation)我让它运行了15分钟,取消了大约250张记录。
第四次尝试
我将查询更改为使用OpenXML:
declare $idoc int
exec sp_xml_preparedocument @idoc output, @xml
select Credit
,... -- the rest of the elements
from openxml(@idoc, '/wrapper/current_observations', 2)
with (
Credit varchar(256) 'credit'
,...) -- the rest of the elements
exec sp_xml_removedocument @idoc这在10秒内处理了所有的4000+记录!相当可以接受。
虽然我希望这些方法之间会有一些不同,但我并不认为这种差异会如此显著。
所以我的问题很简单
“为什么不同的方法在性能上会有如此巨大的差异?”
我很高兴被证明我使用了前3错误。
发布于 2012-07-15 07:53:36
为了加快XQuery选项的速度,您可能要做的一件事是避免交叉连接。
我看不出您的XML是什么样子的--华盛顿特区的示例只包含一个节点--但是假设该<wrapper>只包含一个<current_observation>,然后在其中包含一个<current_observation>列表,那么您可以优化XQuery以读取:
select
credit = T.observation.value('credit[1]', 'varchar(256)')
,... -- the rest of the elements possible in the file.
from
@xml.nodes('wrapper/current_observation') T(observation)这应该比你在测试中看到的速度快得多。
如果您有时间尝试这一点--我将非常感兴趣地了解这种修改后的方法是如何与原始的XQUery和OPENXML解决方案重叠的。
https://stackoverflow.com/questions/11488577
复制相似问题