如何降低SQL Server中解析小XML的成本?

时间:2015-03-12 12:45:14

标签: sql-server xml tsql

我有以下T-SQL代码:

DECLARE @DesiredCategories TABLE(CategoryID INT, Search BIT, SearchText NVARCHAR(50));

INSERT INTO @DesiredCategories 
    SELECT X.Col.query('id').value('.', 'INT') as CategoryID,
        X.Col.value('@search', 'BIT') as Search,
        X.Col.query('text').value('.', 'NVARCHAR(MAX)') as SearchText
        FROM .nodes('root/node') X(Col);

@XMLCategoryIDs包含这样的XML:

<root>
    <node search="0"><id>10088</id><text></text></node>
    <node search="0"><id>10087</id><text></text></node>
    <node search="0"><id>10090</id><text></text></node>
</root>

可悲的是,这段代码的子树成本非常高(对于以下代码片段而言,它的成本为900)并且似乎是一个性能瓶颈。

包含执行计划 - http://pastebin.com/ptnqJ4jX

我们正在使用XML向存储过程发送不同数量的参数(1-5)。

是的,我是初学者,在SQL中使用XML操作。

1 个答案:

答案 0 :(得分:0)

如果您的xml存储在表中,则可以创建主xml索引,以减少稍后针对该xml的查询的子树成本。您基本上将工作负载转移到流程的早期阶段,但这可能会对您的情况有所帮助。

IF OBJECT_ID('tempdb..#Table') IS NOT NULL
    DROP TABLE #Table;
CREATE TABLE #Table
(
    ID INT IDENTITY PRIMARY KEY
    ,DocumentId INT
    ,Xml XML
)

CREATE PRIMARY XML INDEX PXML_Table_Xml
    ON #Table (Xml);
GO

INSERT INTO #Table 
(
    DocumentId
    ,Xml
)
VALUES
(
    1
    ,
    '
    <root>
        <node search="0"><id>10088</id><text></text></node>
        <node search="0"><id>10087</id><text></text></node>
        <node search="0"><id>10090</id><text></text></node>
    </root>
    '
)

DECLARE @DesiredCategories TABLE(DocumentId INT,CategoryID INT, Search BIT, SearchText NVARCHAR(50));



INSERT INTO @DesiredCategories 
    SELECT 
        DocumentId
        ,CategoryID
        ,Search
        ,SearchText
        FROM #Table
        CROSS APPLY
        (
            SELECT 
                X.Col.query('id').value('.', 'INT') as CategoryID,
                X.Col.value('@search', 'BIT') as Search,
                X.Col.query('text').value('.', 'NVARCHAR(MAX)') as SearchText
             FROM Xml.nodes('root/node') X(Col)
        ) A

SELECT * FROM @DesiredCategories