Почему вставка-выбор в таблицу переменных из переменной XML так медленно? - PullRequest
12 голосов
/ 20 октября 2010

Я пытаюсь вставить некоторые данные из документа XML в таблицу переменных. Меня поражает то, что тот же самый выбор (массовый) выполняется за короткое время, в то время как вставка-выбор занимает много времени и держит процесс сервера SQL ответственным за 100% загрузку ЦП во время выполнения запроса.

Я взглянул на план выполнения и понял, что есть разница. Команда insert-select добавляет дополнительный узел «Table spool», даже если он не назначает стоимость. «Табличная функция [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', 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)

Спасибо большое !!

Ответы [ 2 ]

19 голосов
/ 20 октября 2010

Это ошибка в 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 , в котором также упоминается исправление для этой проблемы Eager Spool / XML Reader (под traceflag 4130).

Причина снижения производительности объясняется в другом элементе соединения

Шпуля была введена из-за общей логики защиты от Хэллоуина (это не требуется для выражений XQuery).

6 голосов
/ 20 октября 2010

Кажется, что это проблема, специфичная для SQL Server 2008. Когда я запускаю код в SQL Server 2005, обе вставки выполняются быстро и выдают идентичные планы выполнения, которые начинаются с фрагмента, показанного ниже как План 1 .В 2008 году первая вставка использует План 1 , но вторая вставка производит План 2 .Остальные оба плана, кроме указанного фрагмента, идентичны.

План 1

alt text

План 2

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...