在SQLS中使用XML提高OUTER APPLY的性能

时间:2018-04-05 18:27:59

标签: sql-server xml tsql xpath xquery

我正在从数据库生成报告,该数据库广泛使用XML来存储时间序列数据。令人讨厌的是,这些条目中的大部分只包含一个值,使一切变得复杂,没有任何好处。在SO上看,我发现了一些使用OUTER APPLY将这些字段解码为单个值的示例。

其中一个查询是在生产机器上超时,所以我正在寻找提高其性能的方法。该查询包含十几行类似于:

SELECT...
 PR.D.value('@A', 'NVARCHAR(16)') AS RP,
...
FROM Profiles LP...
 OUTER APPLY LP.VariableRP.nodes('/X/E') RP(D) 
...

当我查看执行计划时,这些外部应用程序中的每一个都有巨大的运营商成本,但我不确定这是否真的意味着什么。无论如何,这些运营商占查询时间的99%。

有没有人对如何改进这些类型的查询有任何建议?我怀疑在没有OUTER APPLY的情况下有办法做到这一点,但是我的google-fu失败了。

1 个答案:

答案 0 :(得分:2)

从字面上理解

  

这些条目中的大多数只包含一个值

...避免APPLY(在创建派生表时产生相当大的开销)并直接读取唯一的值应该更快:

SELECT LP.VariableRP.value('(/X/E/@A)[1]', 'NVARCHAR(16)') AS RP
FROM Profiles LP 

如果这不能满足您的需求,请向我们展示一些XML示例,但我怀疑这会更快。

  • 有XML索引,但在大多数情况下,它们没有帮助,can make things even worse
  • 您可以使用某种触发器或一次运行逻辑将所需的值转移到侧栏(到相关的边表)中并从那里进行查询。