性能问题使用节点,值方法和交叉应用在SQL中展平XML

时间:2017-12-07 13:57:50

标签: sql sql-server xml xsd xquery-sql

我试图使用下面的代码将XML压缩成SQL表。输入数据表(@incomingTable)包含10k个未键入的XML,查询需要7秒才能返回输出。当我检查执行计划时,发现大部分时间花费在"表Vaued函数(带有XPATH过滤器的XML阅读器)"步。我的猜测是这一步是指查询中的Value方法。

value()方法隐式使用Transact-SQL CONVERT运算符,并尝试将XQuery表达式的结果转换为Transact-SQL转换指定的相应SQL类型。

问题:是否有其他XML方法可以在没有数据类型转换的情况下检索元素/属性值。因为无论如何我想把数据作为字符串。帮助我比较两种方法的结果。

还有其他方法可以优化此查询吗?

select 
sqlXml.value('@ID', 'varchar(50)') as XMLFieldName,
sqlXml.value('@TS', 'varchar(50)') as XMLTSValue,
sqlXml.value('.','varchar(800)') as XMLFieldValue
from @incomingTable
cross apply playfieldvalues.nodes('/PlayAttributes/PlayFields/PlayField') as 
XMLData(sqlXml)

1 个答案:

答案 0 :(得分:0)

尝试使用OPENXML

DECLARE @idoc int;  

EXEC sp_xml_preparedocument @idoc OUTPUT, @incomingTable; 

SELECT    *  
FROM       OPENXML (@idoc, '/PlayAttributes/PlayFields/PlayField',1)  
            WITH (XMLFieldName  varchar(50) '@ID',  
                  XMLTSValue varchar(50) '@TS',
                  XMLFieldValue varchar(800) '.');  

EXEC sp_xml_removedocument @idoc; 
  

OPENXML允许访问XML数据,就像它是关系记录集一样。它提供了XML文档的内存中表示的表格(行集)视图。从技术上讲,OPENXML是一个类似于表或视图的行集提供程序;因此,它可以在使用表或视图的任何地方使用。例如,您可以将OPENXML与SELECT或SELECT INTO语句一起使用,以处理保留在内存中的XML文档。

Source