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 daily
que history
en 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
history
tabla, y estamos agregando 3 millones más de filas.El problema fue con los índices. La
history
tabla tenía 160 millones de filas indexadas. Al ejecutar cualquiera de los dos,COPY FROM
oINSERT INTO .. SELECT
llevaba 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
history
tabla, también puede generar un volcado de SQL:Entonces uno podría usar una herramienta como
git
calcular 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
crontab
trabajo para que el volcado se procese todos los días.fuente