【发布时间】:2012-07-15 00:59:24
【问题描述】:
我正在使用 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# 工作,我试图通过使用在线提供的批量插入方法来加速它(例如:Speeding up inserts using Linq-to-SQL - Part 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 个错误。
【问题讨论】:
标签: xml performance sql-server-2008-r2