首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server XML分解性能

SQL Server XML分解性能
EN

Stack Overflow用户
提问于 2012-07-15 00:59:24
回答 3查看 5.6K关注 0票数 5

我正在使用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文件)

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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错误。

EN

Stack Overflow用户

回答已采纳

发布于 2012-07-15 07:53:36

为了加快XQuery选项的速度,您可能要做的一件事是避免交叉连接。

我看不出您的XML是什么样子的--华盛顿特区的示例只包含一个节点--但是假设该<wrapper>只包含一个<current_observation>,然后在其中包含一个<current_observation>列表,那么您可以优化XQuery以读取:

代码语言:javascript
运行
复制
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解决方案重叠的。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11488577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档