XML 列的修改操作花费太多时间
modify operation on XML column is taking too much time
我怎样才能提高这个查询的性能?
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'。
为了提高 Xml 的性能,您可以创建主 xml 索引,然后为值创建辅助索引。见 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 服务器消耗大量 cpu 资源来生成查询计划,所以我建议您使用 sp_executesql 存储过程并使用查询选项 KEEPFIXED PLAN。这将避免 sql 为不同的值和静态更新重新创建计划。
这是代码示例:
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
希望对您有所帮助。
我怎样才能提高这个查询的性能?
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'。
为了提高 Xml 的性能,您可以创建主 xml 索引,然后为值创建辅助索引。见 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 服务器消耗大量 cpu 资源来生成查询计划,所以我建议您使用 sp_executesql 存储过程并使用查询选项 KEEPFIXED PLAN。这将避免 sql 为不同的值和静态更新重新创建计划。
这是代码示例:
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
希望对您有所帮助。