我正在生成&使用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>
答案 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的东西。如果存在,那将是唯一的......
我会监控系统并选出最昂贵的电话并尝试逐个修改......