Inserción de varias filas frente a múltiples inserciones de una sola fila

9

En mi aplicación hago inserciones de varias filas cuando puedo solo porque reduce la cantidad de viajes de ida y vuelta entre el db y la aplicación.

Sin embargo, tenía curiosidad, ¿hay alguna otra ventaja? Por ejemplo, si se insertan varias filas a la vez de esta manera:

insert into tbl (c1, c2) values
(v1, v2)
(v3, v4)

versus:

insert into tbl (c1, c2) values (v1, v2)
insert into tbl (c1, c2) values (v3, v4)

y la tabla tiene un índice, ¿se calcula el índice una vez en el primer caso y dos veces en el segundo? ¿O es siempre una vez por inserto? Suponga que ambas consultas están en la misma transacción.

Estoy usando PostgreSQL.

cdmckay
fuente
2
Creo que el índice se actualiza una vez por declaración , no una por fila . Entonces, la declaración única debería ser más eficiente que las dos declaraciones. Pero no estoy seguro (por lo tanto no hay respuesta, sólo un comentario)
a_horse_with_no_name
1
Creo que la pregunta correcta es si está encapsulada en la misma transacción. Fuera del estómago, si hay ambos en una transacción, no habrá diferencia.
user1363989
@ user1363989, he actualizado mi pregunta para indicar que ambas consultas estarían en la misma transacción
cdmckay

Respuestas:

5

Creo que @a_horse_with_no_name tiene razón acerca de que el índice se actualiza una vez por declaración, porque si la declaración no ha completado su ejecución, los datos no serán visibles ya que está en la transacción. Y la definición de una declaración incluye tener múltiples valores

Y de acuerdo con los documentos aquí, la creación / actualización del índice funciona más eficientemente con lotes que con declaraciones individuales.

También hay un buen artículo de Peter Manis sobre el rendimiento de varios métodos de inserción que puedo recomendar.

Otra cosa a tener en cuenta es la FILLFACTORdel índice, ya que tiene un impacto en el rendimiento como lo describe Fabien Coelho aquí .

Benjamín
fuente
Si las consultas se agrupan en una transacción, ¿se realizará la actualización del índice una vez por declaración? ¿Habrá una diferencia de rendimiento debido a algo más? No puedo acceder a ninguno de los dos artículos: ¿podría volver a vincular?
Batbrat
1

No creo que actualmente haya diferencias de optimización en el área de mantenimiento de índices a este respecto.

Además de sobrecarga de la red, las otras ventajas de la declaración de valores múltiples son en el análisis sintáctico, bloqueo, etc. (A pesar de que el bloqueo de tabla en tblla toma el primero instrucción de inserción y después se mantuvo durante el resto de la transacción, cada inserto la declaración aún tiene que verificar que el bloqueo esté retenido, y esta verificación no es gratuita)

jjanes
fuente