代码之家  ›  专栏  ›  技术社区  ›  Maury Markowitz

在SQLS中使用XML提高外部应用程序的性能

  •  0
  • Maury Markowitz  · 技术社区  · 6 年前

    我从一个广泛使用XML存储时间序列数据的数据库生成报告。令人恼火的是,这些条目中的大多数只包含一个值,使所有内容变得复杂而没有任何好处。看看这里,我发现了几个使用OUTER APPLY将这些字段解码为单个值的示例。

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

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

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

    有人对如何改进这类查询有什么建议吗?我怀疑有一种方法可以在没有外部应用的情况下做到这一点,但我的google fu失败了。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Gottfried Lesigang    6 年前

    照字面理解

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

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

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

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

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