2010-09-11 12 views
5

En una de mis consultas hay un insert de datos en una tabla temporal. Mirando el plan de consulta, muestra que la inserción real en la tabla temporal tomó 54% (simplemente insertando datos en la tabla temporal). Sin embargo, no se insertan filas en la tabla temporal.plan de consulta muestra el costo del 54% para una inserción cuando no hay filas realmente involucradas

¿Por qué el plan muestra un valor distinto de cero cuando no se insertan filas?

+0

¿puede mostrar una captura de pantalla y/o la declaración SQL? –

Respuesta

2

Incluso en el plan de consulta real los costes de subárbol muestran son basado en estimaciones así como various heuristics and magic numbers used by the cost based optimiser. Pueden ser woefully wrong y se deben tomar con una gran pizca de sal.

Ejemplo para reproducir

create table #t 
(
i int 
) 

insert into #t 
select number 
from master.dbo.spt_values 
where number = 99999999 

Plan

El inserto real era cero filas pero la estimación fue de 1 fila, que es donde el costo subárbol viene.

Editar: Acabo de intentar el siguiente

insert into #t 
select top 0 number 
from master.dbo.spt_values 
where number = 99999999 

Plan

Incluso cuando se pone el número estimado de filas derecha todavía asigna un pequeño coste distinto de cero a la inserción. Supongo que la heurística que utiliza siempre asigna un pequeño elemento de costo fijo.

0

El costo de 54 no significa que las filas deban estar involucradas. ¿Quizás hubo un escaneo de índice u otra operación de búsqueda o tal vez alguna búsqueda no óptima en la cláusula WHERE de ese INSERT en la tabla temporal?

2

echar un vistazo a este

insert into #temp 
select * from sometable 
where left(Somecol,3) = 'BLA' 

que no es sargable por lo que causará una exploración, pero si no se encuentran filas del inserto no sucede ... la exploración todavía sucede

pero si usted hizo esto, entonces el costo debe caer dramáticamente porque ahora el índice puede ser utilizado

insert into #temp 
select * from sometable 
where Somecol like 'BLA%' 

Por cierto me gustaría utilizar STATISTICS TIME y STATISTICS IO en cambio para medir el rendimiento, esos dos son indicadores mucho mejores ... cuando ve 3 lecturas vs 10000 lee sabe lo que está sucediendo ... ¿qué le dice exactamente el 45% cuando todo el proceso podría ejecutarse 3 minutos o 3 segundos

Cuestiones relacionadas