Rbj*_*bjz 12 xml sql-server variables sql-server-2008
我正在尝试将XML文档中的一些数据插入到变量表中.让我感到震惊的是,同一个select-into(批量)运行时,insert-select需要很长时间,并且在执行查询时,SQL Server进程负责100%的CPU使用率.
我看了一下执行计划,然后发现了差异.insert-select添加了一个额外的"表spool"节点,即使它没有分配成本."表值函数[XML Reader]"然后得到92%.使用select-into,两个"表值函数[XML Reader]"各得49%.
请解释"为什么会发生这种情况"和"如何解决这个问题(优雅地)",因为我确实可以批量插入临时表,然后插入到变量表中,但这只是令人毛骨悚然.
我在SQL 10.50.1600,10.005321上尝试了相同的结果
这是一个测试用例:
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)
Run Code Online (Sandbox Code Playgroud)
谢谢一堆!
Mar*_*ith 19
这是SQL Server 2008中的一个错误.使用
insert @columns
select ColumnNames.value('.', 'nvarchar(300)') name
from @xColumns.nodes('/columns/name') T1(ColumnNames)
OPTION (OPTIMIZE FOR ( @xColumns = NULL ))
Run Code Online (Sandbox Code Playgroud)
此解决方法来自Microsoft Connect站点上的项目,该项目还提到了此Eager Spool/XML Reader问题的修补程序(在traceflag 4130下).
由于一般的万圣节保护逻辑(XQuery表达式不需要),因此引入了假脱机.
看起来是特定于SQL Server 2008的问题.当我在SQL Server 2005中运行代码时,两个插入都会快速运行并生成相同的执行计划,这些计划从下面显示为计划1的片段开始.2008年,第一个插入使用计划1,但第二个插入生成计划2.超出所示片段的两个计划的其余部分是相同的.
计划1

计划2
