2010-10-20 81 views
12

我試圖從一個XML文檔插入一些數據到一個變量表中。我的想法是,同一個select-into(bulk)運行時,insert-select會花費很長時間,並且SQL Server進程在查詢執行時佔用100%的CPU使用。爲什麼從XML變量插入選擇變量表如此緩慢?

我看了一下執行計劃和INDEED有一個區別。即使沒有分配成本,insert-select也會添加一個額外的「Table spool」節點。 「表值函數[XML讀取器]」然後獲得92%。通過select-into,兩個「表值函數[XML Reader]」每個都獲得49%。

請解釋「爲什麼會發生這種情況」和「如何解決這個(優雅)」,因爲我確實可以批量插入臨時表,然後插入到變量表中,但這只是令人毛骨悚然。

我想這對SQL 10.50.1600,具有相同的結果

10.00.2531這是一個測試案例:

declare @xColumns xml 
declare @columns table(name nvarchar(300)) 

if OBJECT_ID('tempdb.dbo.#columns') is not null drop table #columns 

insert @columns select name from sys.all_columns 

set @xColumns = (select name from @columns for xml path('columns')) 

delete @columns 

print 'XML data size: ' + cast(datalength(@xColumns) as varchar(30)) 

--raiserror('selecting', 10, 1) with nowait 

--select ColumnNames.value('.', 'nvarchar(300)') name 
--from @xColumns.nodes('/columns/name') T1(ColumnNames) 

raiserror('selecting into #columns', 10, 1) with nowait 

select ColumnNames.value('.', 'nvarchar(300)') name 
into #columns 
from @xColumns.nodes('/columns/name') T1(ColumnNames) 

raiserror('inserting @columns', 10, 1) with nowait 

insert @columns 
select ColumnNames.value('.', 'nvarchar(300)') name 
from @xColumns.nodes('/columns/name') T1(ColumnNames) 

多謝!

回答

19

這是在SQL Server中的錯誤2008 使用

insert @columns 
select ColumnNames.value('.', 'nvarchar(300)') name 
from @xColumns.nodes('/columns/name') T1(ColumnNames) 
OPTION (OPTIMIZE FOR (@xColumns = NULL)) 

此變通辦法來自Microsoft Connect Site上的一個項目,該項目還提供了此Eager Spool/XML Reader問題的修補程序(位於traceflag 4130下)。

的原因性能迴歸在a different connect item

捲筒引入歸因於一般萬聖節保護邏輯 解釋(即不需要的XQuery表達式)。

+0

工作就像一個魅力,謝謝!精確的解釋...有趣的MS – Rbjz 2010-10-20 15:11:23

6

看起來是特定於SQL Server 2008的一個問題,當我在SQL Server 2005中運行的代碼,無論是刀片快速運行,併產生如下所示爲計劃1片段開始相同的執行計劃。在2008年,第一次插入使用計劃1,但第二次插入產生計劃2。除了顯示的片段之外,這兩個計劃的其餘部分是相同的

計劃1

alt text

計劃2

alt text

+0

確切地說:)謝謝。雖然,馬丁的答案爲我殺死了這個bug。現在我該如何處理你的答案?投票,接受呢?乾杯,羅布 – Rbjz 2010-10-20 15:20:32