hibernate @ManyToMany, двунаправленная загрузка

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

Я посмотрел на выполнение план и ОБЯЗАТЕЛЬНО есть разница. Insert-select добавляет дополнительный узел «Table spool», даже если он не назначает стоимость. "Табличная функция [XML Reader]" тогда получает 92%. С select-into две «Табличные функции [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)

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

12
задан Martin Smith 20 October 2010 в 15:10
поделиться