【发布时间】:2016-03-22 08:01:38
【问题描述】:
我有一个场景,我编写了 100 多个程序,这些程序正在执行以下任务
- 加载 XML 文件
- 使用来自 XML 的数据进行操作
- 将数据存储或更新到表中
所有这些过程都包含临时表。这会影响 SQL Server 的性能。目前所有的程序都由计划的作业运行。这使服务器很忙。我正在寻找一些优化的方法来执行转换,这样它就不会影响 SQL 性能。我没有太多经验去做这件事。有什么线索可以实现吗?
这是我如何获取 XML 数据的代码
CREATE TABLE #XMLWithOpenXML([Id] [int] IDENTITY(1,1) NOT NULL, [XMLData] [xml] NULL)
CREATE TABLE #AllFiles (Id INT IDENTITY, Subdirectory NVARCHAR(100), Depth INT, [File] INT)
CREATE TABLE #RowDetail (colone INT, ColTwo NVARCHAR(50), ColThree NVARCHAR(50), )
INSERT INTO #AllFiles
EXEC xp_dirtree 'C:\XmlFiles',1,1
DELETE FROM #AllFiles WHERE [file] = 0
DECLARE @Count AS INT, @FileName AS NVARCHAR(100), @Index AS INT, @Query AS NVARCHAR(4000)
SET @Index = 1
SELECT @Count = COUNT(*) FROM #AllFiles
WHILE(@Index <= @Count)
BEGIN
SELECT @FileName = Subdirectory FROM #AllFiles WHERE Id = @Index
SET @Query =
'INSERT INTO #XMLWithOpenXML (XMLData)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn
FROM OPENROWSET(BULK ''C:\XmlFiles\' + @FileName + ''', SINGLE_BLOB) AS x;'
EXEC(@Query)
SET @Index = @Index + 1
END
DECLARE @XML AS XML, @hDoc AS INT
SET @Index = 1
SELECT @Count = COUNT(*) FROM #XMLWithOpenXML
WHILE(@Index <= @Count)
BEGIN
SET @XML = NULL
SELECT @XML = XMLData FROM #XMLWithOpenXML WHERE Id = @Index
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
INSERT INTO #RowDetail
SELECT x.colone,
x.ColTwo,
x.ColThree
FROM OPENXML(@hDoc, '/root/dir/subdir')
WITH
(
colone INT '../@Id',
ColTwo NVARCHAR(50) '@name',
ColThree NVARCHAR(50) '@value'
) AS x
IF(@hDoc IS NOT NULL)
EXEC sp_xml_removedocument @hDoc
SET @Index = @Index + 1
END
我正在处理不同的 XML 格式。每种格式都包含许多 XML 文件。我必须相应地加载所有这些以及优化的方式。
【问题讨论】:
-
“这可能会影响 [影响] SQL Server 的性能” - 您为什么怀疑?
-
我也在做 SQL 监控。当然,当通过 Openrow (SQL) 将大量 xml 文件转换为转换时,它也需要时间和资源。还有其他程序实际上做同样的事情,但存储方式不同。那就是占用SQL server的时间和资源。
标签: sql-server xml