【发布时间】:2014-04-10 04:56:35
【问题描述】:
我尝试使用 XQuery .nodes 将 XML 分解为临时表,如下所示。但是,我遇到了性能问题。撕碎要花很多时间。请给我一个关于替代方案的想法。
我的要求是将批量记录传递给存储过程并解析这些记录并根据记录值进行一些操作。
CREATE TABLE #DW_TEMP_TABLE_SAVE(
[USER_ID] [NVARCHAR](30),
[USER_NAME] [NVARCHAR](255)
)
insert into #DW_TEMP_TABLE_SAVE
select
A.B.value('(USER_ID)[1]', 'nvarchar(30)' ) [USER_ID],
A.B.value('(USER_NAME)[1]', 'nvarchar(30)' ) [USER_NAME]
from
@l_n_XMLDoc.nodes('//ROW') as A(B)
【问题讨论】:
-
查看 XML 索引和架构集合。基本上,SQL Server 中的 XML 粉碎有一种非常慢的方式,直到您找到一种方法将数据放在可以索引的地方,甚至最好放在作为特定 schemacollection 类型的 XML 列上。他们一起可以进行持续数天的操作,例如不超过 30 秒(这就是我发生的事情)。在这里查看一个很好的例子:stackoverflow.com/questions/61233/…
-
尽量避免使用
//Row的 XPath 表达式 - 这不对性能有好处!使用您的 XPath更具体! -
@Kahn 在 SQL Server 2012 SP1 中使用 XML 索引,尤其是选择性 XML 索引可能是一件好事,但前提是您的数据存储在表中。这里的来源是一个XML变量
@l_n_XMLDoc。 -
感谢您的 cmets。让 XPath 更具体对我来说有些不同。
-
@MikaelEriksson:你是对的,在这种情况下,如果需要将变量更改为表格,至少是暂时的,最好知道这些选项是打开的。我有一个类似的场景,最初大量的 XML 数据存储在一个变量中,并且必须找到一种方法来提高性能。在这种情况下,解决方案确实是将其放入表中,以便对其进行索引并使其使用正确的 schemacollection。 :)
标签: sql sql-server xml