修改XML列上的操作花费了太多时间

时间:2015-08-13 06:53:00

标签: sql sql-server xml performance xquery

如何改善此查询的效果?

UPDATE  table1
SET xmlcol.modify('replace value of (/Root/Tag/text())[1]
                   with sql:variable("@NewValue")')
WHERE xmlcol.value('(/Root/Tag/text())[1]','VARCHAR(100)') = @OldValue

table1中有近95,000行,每行包含'Tag'。

1 个答案:

答案 0 :(得分:1)

为了提高Xml的性能,您可以创建一个主xml索引,然后创建Value的二级索引。见https://msdn.microsoft.com/en-us/library/bb934097.aspx

以下是代码示例:

Create table XmlTest
(
    id int NOT NULL IDENTITY(1,1) CONSTRAINT PK_XmlTest_XmlData PRIMARY kEY,
    XmlData xml
)
GO

Create primary Xml index IX_XML_Primary ON dbo.XmlTest(XmlData);
GO

Create xml index IX_XmlData_Secondary_Value ON dbo.XmlTest(XmlData)
USING XML INDEX IX_XML_Primary
FOR VALUE;
GO

另外,对于xml查询,Sql server会为查询计划生成消耗大量的cpu资源,因此我建议您使用sp_executesql存储过程并使用查询选项KEEPFIXED PLAN。这将避免sql为不同的值和statictics更新重新创建计划。

以下是代码示例:

Declare @Query nvarchar(max);
Declare @QueryParemeters nvarchar(max);

Set @QueryParameters = '@In_NewValue nvarchar(max),@In_OldValue nvarchar(max)'

Set @Query ='UPDATE  table1
             SET xmlcol.modify(''replace value of (/Root/Tag/text())[1]
                   with sql:variable("@In_NewValue")'')
             WHERE xmlcol.value(''(/Root/Tag/text())[1]'',''VARCHAR(100)'') = @In_OldValue OPTION (KEEPFIXED PLAN)'

exec sp_executesql @stmt=@Query,@params=@QueryParameters,@In_NewValue=@NewValue,@In_OldValue=@OldValue

希望它有所帮助。