2012-04-25 19 views
5

Duplicar posibles:
Multiple INSERT statements vs. single INSERT with multiple VALUESqué es la inserción de una sola fila x veces más rápido que la inserción x filas a la vez

Im haciendo un poco de análisis de rendimiento de las operaciones de procesamiento por lotes para una entrada de blog y me he dado cuenta de que cuando se utiliza una instrucción de inserción por lotes, se realiza mucho más lentamente que las declaraciones de SQL individuales equivalentes.

insertando 1000 filas de la siguiente toma aproximadamente 3s

INSERT TestEntities (TestDate, TestInt, TestString) VALUES 
('2011-1-1', 11, 'dsxcvzdfdfdfsa'), 
('2011-1-1', 11, 'dsxcvzdfdfdfsa'), 
('2011-1-1', 11, 'dsxcvzdfdfdfsa') 

insertando 1000 filas como a continuación se lleva 130 ms

INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa') 
INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa') 
INSERT TestEntities (TestDate, TestInt, TestString) VALUES ('2011-1-1', 11, 'dsxcvzdfdfdfsa') 

Esto sólo parece ocurrir en la primera vez que se utiliza un inserto de lote en la tabla pero es reproducible

También tenga en cuenta los datos im inserción es al azar (pero el mismo para ambas consultas)

EDIT:

heres mi caso repro con la im datos aleatorios simulado utilizando para este caso: https://gist.github.com/2489133

+1

@MikaelEriksson sí se trata del mismo tema enferma cerca de éste –

+0

@blam echar un vistazo a http: // stackoverflow.com/q/8635818/1070291 explica el problema con mucha más profundidad, también tiene planes de consulta –

Respuesta

3

La cuestión aquí de acuerdo con Multiple INSERT statements vs. single INSERT with multiple VALUES es que cuando se pone la consulta SQL que tiene que calcular un plan de consulta en la primera ejecución. Para una sola inserción, esto es agradable y rápido, ya que no hay mucho que calcular, y después de haber construido el plan de consulta, solo lo vuelve a utilizar 1000 veces.

En el escenario por lotes, hay 3k variables que deben integrarse en el plan de consulta, lo que lleva mucho más tiempo en calcular.

Una característica increíble que @MartinSmith señala es que hay un número de rendimiento mágico en un lote de hasta 250 filas, lo que significa que el cálculo del plan es muy bajo.

romper mi consulta anterior en 5 200 declaraciones fila reduce el tiempo de ejecución de 94ms para 1000 filas

0

El primero es una declaración única que se ejecuta como una sola transacción. El segundo es 1000 declaraciones con la sobrecarga de 1000 transacciones. La diferencia debería reducirse cuando encierra la segunda en begin transaction y commit transaction.

+0

Ambos se ejecutan dentro de transacciones, pero lo más extraño es que el segundo es el más rápido por un factor de 20. Espero el primero en ser más rápido, es una carga útil más pequeña y una declaración única como dices –

+0

Ten en cuenta que afirma que la instrucción única todo en uno se ejecuta más LENTA. –

+1

@HotLicks: El que tiene 'values' tiene solo 1 transacción, que yo esperaría que fuera más rápido. Si ambos ya están en una transacción, como los comentarios de Lucas, esta respuesta no ofrece ninguna explicación. – Andomar

1

El primer elemento es una declaración grande que debe analizarse, por lo que el tiempo adicional que se gasta allí recae en la sobrecarga de un trabajo de análisis grande en lugar de 1000 pequeños.

Aunque no probé las 1000 filas, hice la prueba de 3 y encontré que el plan de ejecución para la instrucción de inserción individual es más grande. También tenga en cuenta que para 3 insertos separados, solo se reutiliza un plan pequeño.

enter image description here

enter image description here

Cuestiones relacionadas