首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能在Server中优化XML操作吗?

您能在Server中优化XML操作吗?
EN

Stack Overflow用户
提问于 2016-10-19 12:30:39
回答 1查看 213关注 0票数 2

我正在使用SQL从数据库中生成&通过SQL代理发送XML事件--它工作得很好。但是,我正在查看SQL计划,并对一些统计数据感到有点震惊。小的转换似乎花费了相当多的CPU时间。

我在网上看到的所有示例都通过添加索引(等)...but来优化XML所在的表--我没有表(我只是在生成XML)。

因此..。

问:有办法“优化”这种“代际”语句吗?

  • 也许有些方法比其他方法更好?
  • 我还没有在网上看到关于这件事的任何东西。

谢谢。

昂贵语句的示例:

代码语言:javascript
复制
DECLARE @CurrentId UNIQUEIDENTIFIER = (SELECT @Event.value('(/Event/@auditId)[1]', 'UNIQUEIDENTIFIER'));

SET @Event.modify('replace value of (/Event/@auditId)[1][1] with sql:variable("@NewId")');

事件XML:

一个事件看起来就像..。

代码语言:javascript
复制
<Event auditId="FE4D0A4C-388B-E611-9B4D-0050569B733D" force="false" CreatedOn="2016-10-05T20:14:20.020">
    <DataSource machineName="ABC123">DatabaseName</DataSource>
    <Topic>
        <Filter>TOPIC/ENTITY/ACTION</Filter>
    </Topic>
    <Name>Something.Created</Name>
    <Contexts>
        <Context>
            <Name>TableName</Name>
            <Key>
                <IssueId>000</IssueId>
            </Key>
        </Context>
    </Contexts>
</Event>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-19 13:27:32

XML索引不会帮助您处理这个问题(Read this)。在非常罕见的情况下,这种索引可以帮助您。如果使用完整路径从XML中读取,则效果很高。在您使用XQuery的那一刻,任何类型的导航都会使事情变得更糟。

.modify()相当重。在这种特殊情况下,重新构建XML可能会更快(您比引擎更了解它):

代码语言:javascript
复制
DECLARE @xml XML=N'
<Event auditId="FE4D0A4C-388B-E611-9B4D-0050569B733D" force="false" CreatedOn="2016-10-05T20:14:20.020">
    <DataSource machineName="ABC123">DatabaseName</DataSource>
    <Topic>
        <Filter>TOPIC/ENTITY/ACTION</Filter>
    </Topic>
    <Name>Something.Created</Name>
    <Contexts>
        <Context>
            <Name>TableName</Name>
            <Key>
                <IssueId>000</IssueId>
            </Key>
        </Context>
    </Contexts>
</Event>';

DECLARE @NewId UNIQUEIDENTIFIER=NEWID();

SELECT @NewId AS [@auditId]
      ,e.value('@force','nvarchar(max)') AS [@force] --read this as string to avoid expensive conversions
      ,e.value('@CreatedOn','nvarchar(max)') AS [@CreatedOn] --same here
      ,e.query('*') AS [node()] --read "as-is"
FROM @xml.nodes('/Event') AS A(e)
FOR XML PATH('Event');

有--当然!--没有通用的方法可以更快地获得XML。如果它存在的话,它将是唯一.

我会监视系统,找出最昂贵的电话,然后一个接一个地修改.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40131473

复制
相关文章

相似问题

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