2009-04-02 18 views
21

Tengo una utilidad en mi aplicación en la que necesito realizar una carga masiva de las operaciones INSERT, UPDATE & DELETE. Estoy tratando de crear una transacción en torno a esto para que, una vez que se invoque este sistema y se le suministren los datos, se asegure de que se haya agregado todo o ninguno a la base de datos.Tamaño máximo de transacción en PostgreSQL

La preocupación de lo que se tiene es ¿cuáles son las condiciones de frontera aquí? ¿Cuántas INSERTAR, ACTUALIZAR & ELIMINAR puedo tener en una sola transacción? ¿Se puede configurar el tamaño de la transacción?

Cualquier ayuda sería apreciada.

-Gracias

Respuesta

18

No creo que hay una cantidad máxima de trabajo que se puede realizar en una transacción. Los datos se siguen añadiendo a los archivos de la tabla y, finalmente, la transacción confirma o retrotrae: AIUI este resultado se almacena en pg_clog; si retrocede, el espacio eventualmente será recuperado por vacío. Por lo tanto, no es como si el trabajo de transacción en curso se mantuviera en la memoria y se descartara en el momento de la confirmación, por ejemplo.

+14

Esto es solo parcialmente correcto. Dentro de cada transacción hay un contador de comandos que trata sobre la visibilidad dentro de la transacción. Este es un número de 32 bits que eventualmente se desbordará si tiene una transacción muy grande (miles de millones de comandos). VACUUM, pg_clog, etc. solo se refiere al número total de transacciones en el sistema, no a lo que sucede dentro de una de ellas. –

+0

@MagnusHagander ¿Sigue siendo cierto este número de 32 bits? ¿Este número se ha actualizado a 64 bits? – Kuberchaun

+0

Sí, el contador de comandos interno aún es de 32 bits. –

16

Para un proyecto en el que trabajo, realizo 20 millones de INSERT. Intenté con una gran transacción y con una transacción por cada millón de INSERT y las actuaciones parecían exactamente iguales.

PostgreSQL 8.3

+1

¿El sistema era local? Creo que al hacer esto en un sistema donde la latencia es un factor, el rendimiento sería diferente. – user2677679

0

creo que la cantidad máxima de trabajo está limitada por el tamaño de su archivo de registro. La base de datos nunca permitirá que no se pueda retrotraer, por lo que si consumes todo tu espacio de registro durante la transacción, se detendrá hasta que le des más espacio o restituyas. Esto es generalmente cierto para todas las bases de datos.

Recomendaría fragmentar sus actualizaciones en trozos manejables que requieren de un par de minutos de tiempo de ejecución, de esa manera usted sabe si hay un problema anterior (por ejemplo, lo que normalmente dura 1 minuto sigue ejecutándose después de 10 minutos ... hmmm, ¿alguien soltó un índice?)

+8

Esto no es cierto para PostgreSQL. Podemos reciclar el espacio de registro durante una transacción en ejecución. Si está haciendo un registro de archivos, obviamente necesitará espacio en la ubicación del archivo, pero para el registro de transacciones local no es necesario. (Necesitará el espacio de disco real para los datos en el disco, por supuesto). –

18

Una sola transacción puede ejecutar aproximadamente dos mil millones de comandos en ella (2^31, menos IIRC un poco de sobrecarga. En realidad, ahora que lo pienso, puede ser 2^32 - el contador de comandos no está firmado, creo).

Cada uno de esos comandos puede modificar varias filas, por supuesto.

Cuestiones relacionadas