2010-10-20 10 views
12

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 !!

Respuesta

19

trata de un error en SQL Server 2008. Uso

insert @columns 
select ColumnNames.value('.', 'nvarchar(300)') name 
from @xColumns.nodes('/columns/name') T1(ColumnNames) 
OPTION (OPTIMIZE FOR (@xColumns = NULL)) 

Esta solución procede de un elemento en el Microsoft Connect Site que también menciona una revisión para este problema de Eager Spool/XML Reader (bajo traceflag 4130).

La razón de esta disminución de desempeño se explica en a different connect item

Se introdujo el carrete debido a una lógica de protección de Halloween en general (que no es necesario para las expresiones XQuery).

+0

¡Funcionó como un amuleto, gracias! Explicación precisa ... divertida MS – Rbjz

6

Parece ser un problema específico de SQL Server 2008. Cuando ejecuto el código en SQL Server 2005, ambas inserciones se ejecutan rápidamente y producen planes de ejecución idénticos que comienzan con el fragmento que se muestra a continuación como Plan 1. En 2008, el primer inserto usa Plan 1 pero el segundo inserto produce Plan 2. El resto de ambos planes más allá del fragmento que se muestra son idénticos.

Plan de 1

alt text

Plan de 2

alt text

+0

Exactamente :) gracias. Sin embargo, la respuesta de Martin mata el error para mí. ¿Ahora qué hago con tu respuesta? Vota, acepta también? Cheers, Rob – Rbjz

Cuestiones relacionadas