Tengo dos tablas de base de datos. Uno contiene cientos de millones de registros. Llamemos a eso history. El otro se calcula a diario y quiero copiar todos sus registros en el history.
Lo que hice fue correr:
INSERT INTO history SELECT * FROM daily
E hizo el truco por un tiempo, pero comenzó a volverse cada vez más lento a medida que el número de registros seguía creciendo. Ahora tengo alrededor de 2 millones de discos que necesitan ser copiados de dailyque historyen una sola operación y se tarda mucho tiempo en completarse.
¿Existe otra forma más eficiente de copiar datos de una tabla a otra?
fuente

Volcar la tabla en formato csv
use el comando COPIAR, que es mucho más eficiente para grandes cantidades de datos.
Consulte los documentos de Postgres en http://www.postgresql.org/docs/current/static/sql-copy.html para obtener más información
fuente
historytabla, y estamos agregando 3 millones más de filas.El problema fue con los índices. La
historytabla tenía 160 millones de filas indexadas. Al ejecutar cualquiera de los dos,COPY FROMoINSERT INTO .. SELECTllevaba mucho tiempo no insertar filas, sino actualizar índices. Cuando deshabilité los índices, importó 3 millones de filas en 10 segundos. Ahora necesito encontrar una forma más rápida de reindexar la tabla grande.fuente
Puede usar la herramienta psql , podría ser eficiente, como lo siguiente,
También puedes escribir un script de shell.
fuente
Por supuesto, esta no es una respuesta exacta a su pregunta, pero si no necesita acceder a la
historytabla, también puede generar un volcado de SQL:Entonces uno podría usar una herramienta como
gitcalcular la diferencia y almacenarla de manera eficiente.Esto es útil porque la mayoría de las partes de una base de datos no cambiarán todos los días. En lugar de almacenar una copia completa para cada día, uno puede almacenar la diferencia entre dos días.
Puede usar un
crontabtrabajo para que el volcado se procese todos los días.fuente