【问题标题】:Improving performance of an OUTER APPLY with XML in SQLS在 SQL 中使用 XML 提高 OUTER APPLY 的性能
【发布时间】:2018-04-05 18:27:58
【问题描述】:

我正在从一个广泛使用 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) 
...

当我查看执行计划时,这些 OUTER APPLY 中的每一个都有巨大的运营商成本,尽管我不确定这是否真的意味着什么。无论如何,这些运算符占查询时间的 99%。

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

【问题讨论】:

  • 你是说你想要一个假设只有一个匹配节点的查询?
  • 认为是这样,但我正在研究一个带有少量属性的示例数据库,所以我不确定我是否应该将其作为最终结论。我感觉正确的解决方案是简单地返回文本并使用 VBA 中的 DOM 解析它。

标签: sql-server xml tsql xpath xquery


【解决方案1】:

从字面上理解

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

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

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

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

  • 有 XML 索引,但在大多数情况下它们无济于事,can make things even worse
  • 您可能会使用某种触发器或一次性运行逻辑将所需的值转移到侧列(到相关的侧表中)并从那里查询。

【讨论】:

  • 那 [1] 有什么特别之处吗?那不应该是 [0] 吗?
  • 性能大大提高!喜欢10次或更多。我相信这可以解决问题。
  • @MauryMarkowitz 很高兴为您提供帮助! [1] 只是第一个XPath 中没有[0]
  • 哦不,我有 VBA 闪回!
猜你喜欢
  • 2018-01-15
  • 2017-08-24
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2012-03-25
  • 2014-01-04
相关资源
最近更新 更多