Estoy tratando de insertar algunos datos de un documento XML en una tabla de variables. Lo que me sorprende es que el mismo select-into (bulk) se ejecuta en poco tiempo, mientras que insert-select toma años y hace que el proceso SQL Server sea responsable del 100% del uso de la CPU mientras se ejecuta la consulta.¿Por qué insertar-seleccionar a la tabla variable de la variable XML tan lento?
Eché un vistazo al plan de ejecución y EN VERDAD hay una diferencia. La inserción-selección agrega un nodo adicional "Carrete de tabla" aunque no asigne un costo. La "Función de valor de tabla [XML Reader]" obtiene un 92%. Con select-into, las dos "Tabla de función valorada [XML Reader]" obtienen 49% cada una.
Por favor, explique "¿POR qué está sucediendo esto?" Y "CÓMO resolver esto (elegantemente)" ya que puedo insertar a granel en una tabla temporal y luego insertarlo en una tabla variable, pero eso es escalofriante.
yo probamos este en SQL 10.50.1600, 10.00.2531, con los mismos resultados
He aquí un caso de prueba:
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)
Muchísimas gracias !!
¡Funcionó como un amuleto, gracias! Explicación precisa ... divertida MS – Rbjz