sql-server – 为什么从XML变量中插入选择到变量表这么慢?

前端之家收集整理的这篇文章主要介绍了sql-server – 为什么从XML变量中插入选择到变量表这么慢?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将一些 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).

猜你在找的MsSQL相关文章