您可以优化SQL Server中的XML操作吗?

时间:2016-10-19 12:30:39

标签: sql-server xml

我正在生成&使用SQL CLR通过SQL BROKER从数据库发送XML EVENTS - 它运行良好。但是,我正在研究SQL PLAN,并对一些统计数据感到有些震惊。小的转换似乎花费了相当多的CPU TIME。

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

就这样......

问:有没有办法“优化”这类“代际”陈述?

  • 也许有些方法比其他方法更好?
  • 我还没有在网上看到任何有关此内容的信息

感谢。

费用陈述样本:

DECLARE @CurrentId UNIQUEIDENTIFIER = (SELECT @Event.value('(/Event/@auditId)[1]', 'UNIQUEIDENTIFIER'));

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

EVENT XML:
事件看起来像......

<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>

1 个答案:

答案 0 :(得分:1)

XML索引无法帮助您(Read this)。有非常罕见的情况,这种索引可以帮助你。如果您使用完整路径从XML读取,效果很高。在您使用XQuery,任何类型的导航时,它会让事情变得更糟。

.modify()非常沉重。在这种特殊情况下,可以更快地重建XML(你对它的了解比引擎更多):

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的东西。如果存在,那将是唯一的......

我会监控系统并选出最昂贵的电话并尝试逐个修改......