我正在使用 NOAA 当前的观察 XML(例如:Washington DC)并将 4000 多个站点的文件切碎到 SQL Server 2008 R2 表中。在尝试了许多不同的方法之后,我有了一个正在推进的方法。
这个问题是关于不同方法之间的性能,最重要的是为什么它如此激烈。
第一次尝试
在 C# 中工作时,我使用 Linq to XML 解析所有文件,并使用 Linq to SQL 将结果记录写入数据库。这个代码是可预测的,所以我不会让你厌烦它。
用 linq 重写到实体框架没有帮助。
这导致应用程序运行了一个多小时,并且只处理了 1600 个左右的文件。缓慢是 Linq to SQL 和 Linq to Entities 为每条记录执行插入和选择的结果。
第二次尝试
仍在使用 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 个错误。