【发布时间】: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 indexoverData列和二级 xml 索引... for property应该有帮助 -
尝试了 XML 索引,但没有任何区别。有没有更优化的方法来做到这一点。该查询作为报告的一部分运行,因此我认为只是使用每小时作业将整个结果表转储到汇总表中,然后在报告中查询该汇总表
标签: sql-server xml tsql xml-parsing azure-sql-database