我有以下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操作。
答案 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