我正在使用SQL从数据库中生成&通过SQL代理发送XML事件--它工作得很好。但是,我正在查看SQL计划,并对一些统计数据感到有点震惊。小的转换似乎花费了相当多的CPU时间。
我在网上看到的所有示例都通过添加索引(等)...but来优化XML所在的表--我没有表(我只是在生成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")');事件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>发布于 2016-10-19 13:27:32
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。如果它存在的话,它将是唯一.
我会监视系统,找出最昂贵的电话,然后一个接一个地修改.
https://stackoverflow.com/questions/40131473
复制相似问题