好的,所以使用@Matthius R. jessen 的建议,我将我的主文件分成 500000 个块
使用此软件分割文件Firstobject XMl editor(free) 可以从命令行调用,并且能够加载一个非常大的 xml 文件,而其他一些软件则难以解决。
然后我用它从拆分文件中提取数据。
USE [OPENXMLTesting]
GO
DROP TABLE [dbo].[XMLwithOpenXML]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[XMLwithOpenXML](
[Id] [int] IDENTITY(1,1) NOT NULL,
[XMLData] [xml] NULL,
[LoadedDateTime] [datetime] NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
USE OPENXMLTesting
GO
INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK 'C:\Scripts\ImportTest\piece1.xml', SINGLE_BLOB) AS x;
SELECT * FROM XMLwithOpenXML
将数据插入 SQL 的总时间 34 秒
然后使用
从元素中查询我想要的主要数据的结果
USE OPENXMLTesting
GO
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = XMLData FROM XMLwithOpenXML
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT Product_ID, path, Updated, Quality, Supplier_id, Prod_ID, Catid, On_Market,
Model_Name, Product_View, HighPic, HighPicSize, HighPicWidth, HighPicHeight,
Date_Added
FROM OPENXML(@hDoc, 'root/file')
WITH
(
`Product_ID [int] '@Product_ID',
path [varchar](100) '@path',
Updated [varchar](50) '@Updated',
Quality [varchar](50) '@Quality',
Supplier_id [int] '@Supplier_id',
Prod_ID [varchar] '@Prod_ID',
Catid [int] '@Catid',
On_Market [int] '@On_Market',
Model_Name [varchar](250) '@Model_Name',
Product_View [int] '@Product_View',
HighPic [varchar] '@HighPic',
HighPicSize [int] '@HighPicSize',
HighPicWidth [int] '@HighPicWidth',
HighPicHeight [int] '@HighPicHeight',
Date_Added [varchar](150) '@Date_Added'
)
EXEC sp_xml_removedocument @hDoc
GO
这一步57秒检索root的子元素及其属性的总时间
然后,我需要从父元素中取回元素的子元素以及引用的 Prod_ID,以便稍后对数据执行连接。
我跑了
USE OPENXMLTesting
GO
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = XMLData FROM XMLwithOpenXML
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT Prod_ID, M_Prod_ID
FROM OPENXML(@hDoc, 'root/file/M_Prod_ID',2)
WITH
(
Prod_ID [varchar] (50) '../@Prod_ID',
M_Prod_ID [varchar] (50) '../M_Prod_ID'
)
EXEC sp_xml_removedocument @hDoc
GO
总共 32 秒。
因此,总时间拉入并查询我想要的元素的 500,000 行,而其中的子元素花费了 2 分 3 秒。不是实际的插入,而是选择,因此可能需要多一点才能将数据放入数据库,但不会太多。
然后,我使用旧的 Powershell 脚本尝试了相同的操作,结果花费了 6 分 39 秒。
如果处理整个文件,现在大约需要 32 分钟,而大约需要 2.5 小时,这是一个很大的改进。我现在需要做的就是编写一个脚本来遍历拆分文件并一个接一个地导入。
感谢大家的建议。我对结果很满意。之前我可以通过进一步清理 XML 来加快它的速度,但现在我对现在将要短得多的过程感到非常满意。