2015-08-13 50 views
2

我怎樣才能提高此查詢的性能?修改XML列的操作太耗時

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中9.5萬行,每個包含「標籤」。

+0

這怎麼列的內容看?需要多少時間?它多久需要運行一次? – Tomalak

+0

與例如添加XML – Backs

回答

1

爲了增加你的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 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 @[email protected],@[email protected],@[email protected],@[email protected] 

希望它能幫助。