【发布时间】:2018-09-18 17:06:22
【问题描述】:
我目前正在尝试在 T-SQL 中创建一个存储过程,它以 XML 表作为输入,然后将其中的数据插入到临时表中。
我使用的 XML 格式如下:
<Table>
<row MyFirstColumn="foo" MySecondColumn="bar" ... />
</Table>
我用来将此 XML 数据插入临时表的 SQL 格式如下:
INSERT INTO
#TempTable
SELECT
T.c.value('@MyFirstColumn', 'varchar(50)')
,T.c.value('@MySecondColumn', 'varchar(50)')
,...
FROM
@x.nodes('//Table/row') T(c)
但是,我对包含 150 列和超过 200,000 行的 XML 表执行此操作。目前,对 10,000 行执行此 SQL 大约需要 142 秒,因此这完全不适合处理包含大量行的 XML 表。
谁能建议一种方法来加快这个过程?
【问题讨论】:
-
创建数据的关系模型,并使用您已经在使用的工具将数据插入到这些表中。然后可以对这些表进行索引、压缩、分区等操作。一旦您完成了这项工作 (ETL),您就可以比查询 XML 文档更快地查询这些表。
-
尝试将 xml 存储到临时表 CREATE TABLE #tmp (xml_content xml) 中。在临时表上创建 XML 主索引,并查询临时表。这可能比直接查询 xml 更快。
-
SQLXML 批量加载是从 xml 文件导入数据的最快方法之一。 docs.microsoft.com/en-us/sql/relational-databases/…
-
SQLXML 4.0 对象是否不需要 .NET 框架?
-
我听说过一些事情(当然我在这里的经验有限)可以加快速度。 1. 使用对象而不是表格更快。 2. 对于更大的数据集,使用 OPENXML 更快。 3. 在 VB 脚本中使用带有 SQLXML 批量加载的 ODBC 连接可以很快。我不知道这意味着什么,因为我还没有真正研究过它 4. 我感兴趣的是将部分 xml 加载到对象变量中,因为当您添加节点/行时,它会以指数方式变慢,因此可能会递归加载最佳一次的节点/行数。
标签: sql sql-server xml tsql