我試圖從一個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)
多謝!
工作就像一個魅力,謝謝!精確的解釋...有趣的MS – Rbjz 2010-10-20 15:11:23