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

标签 sql-server xml sql-server-2008 variables

我正在尝试将 XML 文档中的一些数据插入到变量表中。令我震惊的是,相同的 select-into(批量)立即运行,而 insert-select 需要很长时间,并使 SQL Server 进程在查询执行时负责 100% 的 CPU 使用率。

我查看了执行计划,确实存在差异。 insert-select 添加了一个额外的“Table spool”节点,即使它没有分配成本。然后“表值函数 [XML 阅读器]”得到 92%。使用 select-into,两个“表值函数 [XML 阅读器]”各获得 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)

非常感谢!!

最佳答案

这是 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).

关于sql-server - 为什么从 XML 变量插入选择变量表这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3978807/

相关文章:

mysql - 使用联合表将 MySQL 连接到 MSSQL

sql-server - PowerShell New-AzSqlDatabaseImport - 0 : The storage account cannot be accessed. 请检查存储帐户名称和 key ,然后重试

c# - 从 SQL Server 调用但在 C# 中工作时,Eternal File.Exist CLR C# 不工作

java - 配置 XMLConstants.html#FEATURE_SECURE_PROCESSING 时出现 XSLT 和 FOP 问题

sql-server - 如何在 SQL Server 2008 R2 中检查用户是否具有系统管理员权限

sql-server - SQL - 如何合并行

java - 记住不同屏幕上的按钮点击

java - 为什么 JAXB 的 xjc 的 XML 文件输入与我的不同?

sql-server-2008 - SQL Server Intellisense 不适用于 *某些 * 服务器

sql-server - SQL Server 2008 中的循环连接