J'ai deux tables de base de données. L'un contient des centaines de millions d'enregistrements. Permet d'appeler celui-là history
. L'autre est calculé quotidiennement et je souhaite copier tous ses enregistrements dans celui- history
ci.
Ce que j'ai fait était de courir:
INSERT INTO history SELECT * FROM daily
Et ça a fait l'affaire pendant un moment, mais ça a commencé à devenir de plus en plus lent au fur et à mesure que le nombre de disques augmentait. Maintenant , j'ai environ 2 millions d' enregistrements qui doivent être copiés à partir daily
de history
en seule opération et prend trop de temps pour terminer.
Existe-t-il un autre moyen plus efficace de copier des données d’une table à l’autre?
la source
Dump la table au format csv
utilisez la commande COPY, qui est beaucoup plus efficace pour les grandes quantités de données.
Consultez postgres docs sur http://www.postgresql.org/docs/current/static/sql-copy.html pour plus d'informations.
la source
history
table et nous ajoutons 3 millions de lignes supplémentaires.Le problème était avec les index. La
history
table avait 160 millions de lignes indexées. En exécutant l’unCOPY FROM
ou l’ autre,INSERT INTO .. SELECT
il fallait beaucoup de temps pour insérer des lignes, mais pour mettre à jour les index. Quand j'ai désactivé les index, il a importé 3M lignes en 10 secondes. Maintenant, je dois trouver un moyen plus rapide de réindexer la grande table.la source
Vous pouvez utiliser l' outil psql , je pourrais être efficace, comme suit,
Aussi, vous pouvez écrire un script shell.
la source
Ce n'est bien sûr pas une réponse exacte à votre question, mais si vous n'avez pas besoin d'accéder à la
history
table, vous pouvez également générer un cliché SQL:Ensuite, on pourrait utiliser un outil comme celui-ci
git
pour calculer la différence et la stocker efficacement.Ceci est utile car la plupart des composants d’une base de données ne changeront pas tous les jours. Au lieu de stocker une copie complète pour chaque jour, on peut stocker la différence entre deux jours.
Vous pouvez utiliser un
crontab
travail tel que le vidage soit traité chaque jour.la source