【问题标题】:SQL process XML performance: Insert into columns in a tableSQL 处理 XML 性能:插入到表中的列中
【发布时间】:2013-05-27 12:28:31
【问题描述】:

我在 SQL 过程中遇到问题,我似乎找不到合适的解决方案。 存储过程包含一个 XML 数据类型的参数(名称 = @data)。

传入消息的示例如下(实际消息包含更多节点,但为简单起见,我将它们省略了):

<Suppliers xmlns="">
  <Supplier>
    <IDCONO>3</IDCONO>
    <IDSUNO>009999</IDSUNO>
    <IDSUTY>0</IDSUTY>
  </Supplier>
</Suppliers>

在我的 SQL 数据库中,我有一个名为“Supplier”的表,它包含与 XML 中的节点完全相同的列(IDCONO、IDSUNO、IDSUTY、..)

我需要遍历节点并将数据插入列中。 我已经实现了下面的过程,但这给我带来了很多关于较大文件的性能问题(处理时间长,甚至超时):

INSERT INTO SUPPLIER
   (IDCONO
   ,IDSUNO
   ,IDSUTY)
SELECT
   T.C.value('IDCONO[1]', 'VARCHAR(50)') as IDCONO,
   T.C.value('IDSUNO[1]', 'VARCHAR(50)') as IDSUNO,
   T.C.value('IDSUTY[1]', 'VARCHAR(50)') as IDSUTY
from @data.nodes('/Suppliers/Supplier') T(C)

任何帮助表示赞赏! 注意SQL版本是SQL server 2012。

提前致谢。

【问题讨论】:

    标签: sql-server xml stored-procedures sql-server-2012


    【解决方案1】:

    我首先尝试的是在使用 XML 数据类型时指定 text() 节点,以防止 SQL Server 对文本元素进行深度搜索。

    INSERT INTO SUPPLIER
       (IDCONO
       ,IDSUNO
       ,IDSUTY)
    SELECT
       T.C.value('(IDCONO/text())[1]', 'VARCHAR(50)') as IDCONO,
       T.C.value('(IDSUNO/text())[1]', 'VARCHAR(50)') as IDSUNO,
       T.C.value('(IDSUTY/text())[1]', 'VARCHAR(50)') as IDSUTY
    FROM @data.nodes('/Suppliers/Supplier') T(C)
    

    如果这还不够好,我会尝试使用 OPENXML。

    DECLARE @idoc INT
    EXEC sp_xml_preparedocument @idoc OUT, @data
    
    INSERT INTO SUPPLIER
       (IDCONO
       ,IDSUNO
       ,IDSUTY)
    SELECT IDCONO, IDSUNO, IDSUTY
    FROM OPENXML(@idoc, '/Suppliers/Supplier', 2) WITH
            (IDCONO VARCHAR(50),
             IDSUNO VARCHAR(50),
             IDSUTY VARCHAR(50))
    
    
    EXEC sp_xml_removedocument @idoc
    

    【讨论】:

    • 您好,非常感谢您的回复。添加 /text() 只会稍微提高性能。使用 OPENXML 解决方案可为我提供所需的性能。我做了一些研究,OPENXML 函数分配了服务器内存的 1/8 是真的吗?如果我在很短的时间内(使用大型 xml 文件)多次调用存储过程会出现问题吗?
    • @Rise_against 我不知道你是否会有问题。我可以告诉你,我经常使用并且已经使用openxml 将数据加载到数据库中。最大的批次大约是 25 GB XML 文件,其中单个文件在 1 到 15 MB 之间。我没有看到任何问题,因为我们正在加载很多文件,也没有看到任何问题,因为文件很大。但是,是的,这是真的。 AFAIK,SQL Server 将 1/8 的内存分配给 XML 处理。
    • openxml 的速度惊人地快。对于 3000 条记录(4 列),我将执行时间从 100.000 毫秒减少到 300 毫秒!
    • @Yann39 听起来不对。如果您使用的是 SQL Server 2008/2008 R2,您可能会遇到在 CU1 中已修复的错误,但您需要启用跟踪标志才能启用修复。看看stackoverflow.com/a/3979266/569436
    • 确实,我使用的是 SQL Server 2008 v10.00.2573。非常感谢您提供的信息!
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多