XML解析缓慢


8

我目前正在尝试调整一个有问题的存储过程,并且我已经注意到,与运行该存储过程相关的大部分成本来自将某些XML解析为临时表的解析。这是有问题的SQL:

CREATE TABLE #ChangeSet 
(
    RemarkTypeID TINYINT NOT NULL PRIMARY KEY,
    RemarkText VARCHAR(2500) NOT NULL,
    ListingID INT NOT NULL
)
INSERT INTO #ChangeSet
    (RemarkTypeID, 
    RemarkText,
    ListingID)
SELECT
    T.c.value('@RemarkTypeID[1]','tinyint') AS RemarkTypeID,
    T.c.value('@RemarkText[1]','varchar(2500)') AS RemarkText,
    @ListingID
FROM @RemarksXml.nodes('/Remarks[1]/Remark') AS T(c)

此外,因此您对要解析的XML的结构有一些了解:

  <Remarks>
    <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211767" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="8" RemarkText="aaaWasher,Dryer,Refriger,Microwav" />
    <Remark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" RemarkID="211768" DateTimeCreated="1991-11-19T10:43:50" DateTimeModified="1992-01-01T10:43:50" RemarkTypeID="3" RemarkText="aaaell Maintained 3Bd 1.5Ba Semi-Detached Home In Cambridge Gardens. Garage W As Converted Into A Nice Family Room The Outside Is Maintence Free. Includes All Appliances,Security System,Storage Shed,Ceiling Fans And New Carpet.This Home Is Very Well Pricded. Seller Will Consider Fha Or Va Along With Conventional Finacing. This Is A Great Buy." />
 </Remarks>

我可以做些什么来提高解析这些XML节点和设置此临时表的性能?


xml是否作为参数传递?
World Wide DBA

3
您的XML有多大,有多少个“请求”节点,速度有多慢?XML查询的成本是没有用的,并且不会告诉您实际的性能。
Mikael Eriksson

Answers:


5

你可以试试看OPENXML。现在我通常不建议这样做,OPENXML因为它存在许多众所周知的内存问题(基本上,它可能占用您缓冲池的1/8,具体取决于XML的大小)(!! TODO添加链接)。不管怎么说,它对于较大的XML片段来说速度更快,因此在开发/测试环境中值得一试,如果您知道内存问题并获得性能,则可以自行决定最需要哪一个。像这样:

DECLARE @handle INT

EXEC sp_xml_preparedocument @handle OUTPUT, @RemarksXml

INSERT INTO #ChangeSet
SELECT RemarkTypeID, RemarkText, @ListingID
FROM OPENXML( @handle, '/Remarks[1]/Remark', 1 ) 
WITH ( 
    RemarkTypeID    TINYINT,
    RemarkText      VARCHAR(2500)
    )

EXEC sp_xml_removedocument @handle

记住要经常打电话sp_xml_removedocument。我猜您的真实XML更大,您能告诉我们Remark它将包含多少个元素以及以KB / MB为单位的大小。稍后,我将返回该职位,并设置一个测试平台,以根据您的统计信息比较性能。

更新:根据您的示例脚本,您的XML最多只能包含256个Remark元素,最大长度为2500个。创建了一些满足这些条件的示例XML并对其进行了测试,但是这两种技术之间的性能几乎没有,在不到一秒的时间内完成。在这种情况下,我将选择XML数据类型和方法。您能否提供其他要求的信息?


3
SQL Server使用MSXML和DOM处理通过sp_xml_preparedocument加载的文档。它将MSXML可用于DOM处理的虚拟内存限制为计算机物理内存的八分之一或500MB(以较小者为准)
保罗·怀特9

4

您可以做两件事来提高xml解析性能:

  • 将xml变量/列设置为type,这意味着在其上声明一个xsd模式。这将强制进行xml验证,这本身会花费一些时间,但是解析速度会提高。
  • 索引xml列(不适用于xml变量)。您可以根据需要以多种不同方式对xml列进行索引。对于xml blob中更复杂的查询和查找,这可以为您带来出色的性能提升。
  • 如果您的查询是更大查询的一部分,那么我似乎记得xml操作不会并行化,因此您可以明智地分解一个大查询,并在与其余工作分开的单独查询中进行xml解析。

3
我算三件事。:-)
亚伦·伯特兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.