Sto cercando di inserire alcuni dati da un documento XML in una tabella delle variabili. Quello che mi fa venire in mente è che le stesse operazioni di selezione (alla rinfusa) in pochissimo tempo, mentre insert-select impiega anni e mantiene il processo di SQL Server responsabile per l'utilizzo della CPU al 100% mentre la query viene eseguita.Perché inserire - selezionare la tabella delle variabili dalla variabile XML in modo lento?
Ho dato un'occhiata al piano di esecuzione e INDEED c'è una differenza. Insert-select aggiunge un nodo extra "Table spool" anche se non assegna alcun costo. La "Funzione con valori di tabella [Lettore XML]" ottiene il 92%. Con select-in, i due "Funzione di tabella [Lettore XML]" ricevono il 49% ciascuno.
Spiegare "PERCHÉ sta succedendo" e "COME risolvere questo (elegantemente)" come posso effettivamente inserire in una tabella temporanea e quindi a sua volta inserire nella tabella delle variabili, ma è solo raccapricciante.
Ho provato questo su SQL 10.50.1600, 10.00.2531 con gli stessi risultati
Ecco un banco di prova:
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)
ringrazia un mazzo !!
Ha funzionato come un incantesimo, grazie! Spiegazione precisa ... MS divertente – Rbjz