Re: [pgsql-es-ayuda] insert eficiente

2015-10-02 Por tema Gerardo Herzig


- Mensaje original -
> De: "Fernando Rodiño" 
> Para: "Ayuda" 
> Enviados: Jueves, 1 de Octubre 2015 19:45:08
> Asunto: [pgsql-es-ayuda] insert eficiente
> 
> 
> Buenas tardes a todos
> 
> 
> 
> Acudo a su amable ayuda para lo siguiente:
> 
> 
> Tenemos una implementación de Postgres 9.3 y estamos en un proceso
> con Pentaho Data Integration donde se hace un mapeo de unos archivos
> planos a una tabla, se realiza una adecuación de estos datos y se
> hace un insert masivo a una tabla destino X, hasta ahí todo
> funciona, el problema que tenemos es que es mucha información y la
> tabla destino tiene varios indexes que hacen más demorada la
> operación, en Postgres 8.4 uno podía inactivar los indexes mientras
> ejecutaba la operación, pero en Postgres 9.3 no funciona esa
> estrategia o almenos como se hacia en Postgres 8.4 no funciona:
> update pg_index set indisvalid = false where indexrelid =
> 'i_nombre_index'::regclass; Alguien conoce una estrategia para
> realizar este tipo de operaciones que funcione en postgres 9.3
> 
> 
> Muchas gracias por su ayuda.
> 

Para los bulk inserts suele ayudar:
* borrar los indices (y recrearlos luego de la insercion)
* set maintenance_work_mem TO 'una buena porcion de la RAM' (para acelerar la 
creacion de los indices)
* set syncronous_commit to 'OFF' (si puedes tomar el riesgo de perder alguna 
transaccion)
* deshabilitar (temporalmente) autovacuum para la tabla que recibe esos datos

HTH
Gerardo

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda


Re: [pgsql-es-ayuda] insert eficiente

2015-10-02 Por tema Alvaro Herrera
Gerardo Herzig escribió:

> Para los bulk inserts suele ayudar:
> * borrar los indices (y recrearlos luego de la insercion)
> * set maintenance_work_mem TO 'una buena porcion de la RAM' (para acelerar la 
> creacion de los indices)
> * set syncronous_commit to 'OFF' (si puedes tomar el riesgo de perder alguna 
> transaccion)
> * deshabilitar (temporalmente) autovacuum para la tabla que recibe esos datos

BEGIN;
DROP INDEX ...
TRUNCATE TABLE ...  -- borra todos los datos existentes
COPY (FROZEN) ...   -- carga los datos nuevos
CREATE INDEX ...
COMMIT

El TRUNCATE sirve para que el COPY no necesite hacer wal-logging de cada
inserción; el FROZEN de copy (es una opción muy nueva) permite que las
tuplas se inserten "frozen" y no requieran un freeze posterior (que
causaría más escrituras).

-- 
Álvaro Herrerahttp://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda