我正在从数据库生成报告,该数据库广泛使用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失败了。
答案 0 :(得分:2)
从字面上理解
这些条目中的大多数只包含一个值
...避免APPLY
(在创建派生表时产生相当大的开销)并直接读取唯一的值应该更快:
SELECT LP.VariableRP.value('(/X/E/@A)[1]', 'NVARCHAR(16)') AS RP
FROM Profiles LP
如果这不能满足您的需求,请向我们展示一些XML示例,但我怀疑这会更快。