【问题标题】:Is there a more optimal way to retrieve multiple values from an XML Column in SQL Server是否有更优化的方法从 SQL Server 中的 XML 列中检索多个值
【发布时间】:2013-07-05 22:32:07
【问题描述】:

我们的数据库中有一个带有 XML 数据列的表。

在该列中,有一大块 xml 数据,其中存储了许多应用程序值。

在我们更经常调用的查询之一中,在同一个查询中从该 Xml 列中检索到多个值。例如

SELECT 
    v.OtherColumns --...
    ,v.[Data].value('(/Record//Inputs/Net)[1]', 'money') as 'Input Net'
    ,v.[Data].value('(/Record//Inputs/Vat)[1]', 'money') as 'Input Vat'
    ,v.[Data].value('(/Record//Inputs/Gross)[1]', 'money') as 'Input Gross'
    ,v.[Data].value('(/Record//Outputs/Net)[1]', 'money') as 'Output Net'
    ,v.[Data].value('(/Record//Outputs/Vat)[1]', 'money') as 'Output Vat'
    ,v.[Data].value('(/Record//Outputs/Gross)[1]', 'money') as 'Output Gross'
From 
    Validations as v
    --... remainder of query

对我来说,它看起来必须从该列中读取 6 次数据并解析 6 次。当我查看 Sql Azure Portal 下的查询计划时,这是迄今为止对查询的最大打击......

在完整查询中,有约 20 个 XPath 查询针对同一列,每个查询占约 4.7%。

是否有更优化的方式在子查询中检索整个列一次,然后对列的内存内容运行 XPath 查询?

【问题讨论】:

  • 查询的另一部分是什么?你有 [2]、[3] 等的工会吗?
  • 查询的其他部分是对其他表的一些内部连接,但占查询的 0%(因此影响可以忽略不计),并且正在连接的表已正确索引。 20*4.7% TVF 占查询时间的 95%。
  • 实际上并没有一种非常有效的方法来做到这一点 - 这是 XML 数据和 XPath 的本质。您可以为该列添加一个 XML 索引,它可能会显着加快速度。
  • +1 for create primary XML index over Data 列和二级 xml 索引 ... for property 应该有帮助
  • 尝试了 XML 索引,但没有任何区别。有没有更优化的方法来做到这一点。该查询作为报告的一部分运行,因此我认为只是使用每小时作业将整个结果表转储到汇总表中,然后在报告中查询该汇总表

标签: sql-server xml tsql xml-parsing azure-sql-database


【解决方案1】:

尝试使用 XQuery 语句 FLWOR。它应该减少解析时间。 见http://msdn.microsoft.com/en-us/library/ms190945.aspx

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多