Usando PG 9.1 en Ubuntu 12.04.
Actualmente, lleva hasta 24 horas ejecutar un gran conjunto de sentencias ACTUALIZAR en una base de datos, que son de la siguiente forma:
UPDATE table
SET field1 = constant1, field2 = constant2, ...
WHERE id = constid
(Solo estamos sobrescribiendo los campos de los objetos identificados por ID). Los valores provienen de una fuente de datos externa (no está ya en el DB en una tabla).
Las tablas tienen un puñado de índices y no hay restricciones de clave externa. No se hace ningún COMPROMISO hasta el final.
Se necesitan 2 horas para importar una pg_dump
de toda la base de datos. Esto parece una línea de base a la que deberíamos apuntar razonablemente.
A falta de producir un programa personalizado que de alguna manera reconstruya un conjunto de datos para que PostgreSQL vuelva a importar, ¿hay algo que podamos hacer para acercar el rendimiento de ACTUALIZACIÓN masiva al de la importación? (Esta es un área que creemos que los árboles de fusión con estructura de registro se manejan bien, pero nos preguntamos si hay algo que podamos hacer dentro de PostgreSQL).
Algunas ideas:
- eliminando todos los índices que no son de ID y reconstruyendo después?
- aumentando checkpoint_segments, pero ¿esto realmente ayuda a un rendimiento sostenido a largo plazo?
- utilizando las técnicas mencionadas aquí ? (Cargue los datos nuevos como tabla, luego "fusione" los datos antiguos donde la ID no se encuentra en los datos nuevos)
Básicamente hay un montón de cosas para probar y no estamos seguros de cuáles son las más efectivas o si estamos pasando por alto otras cosas. Pasaremos los próximos días experimentando, pero pensamos en preguntar aquí también.
Tengo una carga concurrente en la tabla pero es de solo lectura.
explain analyze
que está usando un índice para la búsqueda?