我试图将一些
XML文档中的数据插入到变量表中.我的想法是,同样的select-into(bulk)在任何时候运行,而insert-select需要老化,并且在查询执行时,sql Server进程对于100%的cpu使用负责.
我看了执行计划和INDEED有差别.插入选择添加一个额外的“表假脱机”节点,即使它不分配成本. “表值函数[XML Reader]”得到92%.通过选择,两个“表值函数[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',1) with nowait select ColumnNames.value('.','nvarchar(300)') name into #columns from @xColumns.nodes('/columns/name') T1(ColumnNames) raiserror('inserting @columns',1) with nowait insert @columns select ColumnNames.value('.','nvarchar(300)') name from @xColumns.nodes('/columns/name') T1(ColumnNames)
感谢一堆!
解决方法
这是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中解释了性能回归的原因
The spool was introduced due to a general halloween protection logic (that is not needed for the XQuery expressions).