Postgres: Copie de grands sous-ensembles de données (plus de 10 000 lignes) d'un schéma à un autre pour une utilisation immédiate

postgresql sqlbulkcopy

Question

J'ai besoin de transférer des lignes d'un schéma Postgres à un autre à la demande. Un schéma stocke le contenu et l'autre est une copie d'un sous-ensemble de données que l'utilisateur final va ajouter, modifier, supprimer pour son utilisation personnalisée. Il y a plus de 10 millions d'enregistrements qui augmentent dans chacune des tables de schéma à mesure qu'augmente le contenu ajouté et que l'utilisateur final absorbe et personnalise davantage de contenu. Le transfert de données représenterait plusieurs milliers d'enregistrements de plusieurs tables vers plusieurs tables de l'autre schéma. Ces schémas sont dans la même base de données. Ces données bougeront tout le temps et devront être extrêmement rapides pour que l'utilisateur final puisse commencer à personnaliser immédiatement après le choix du contenu. J'ai examiné la fonction COPY ainsi que la réplication de déclenchement, mais aucune ne semble fonctionner aussi rapidement que nécessaire. Je ne peux pas supprimer les index avant l'insertion car ces tableaux sont utilisés de manière constante et intensive par les consommateurs. Tout avis serait grandement apprécié.

Réponse acceptée

Étant donné que vous copiez un groupe de tables d’un schéma de base de données sur un autre schéma de la même base de données, vous ne pouvez pas commencer tant que vous ne pourrez pas le faire rapidement en utilisant INSERT INTO ... SELECT FROM utilisateur ayant accès aux deux schémas, par exemple:

INSERT INTO schema2.table_y ( field, field, field )
SELECT field, field, field
FROM schema1.table_y
WHERE user filter condition

Comme vous devez effectuer cette opération sur plusieurs tables, vous pouvez l'envelopper dans une transaction volumineuse ou exécuter plusieurs instructions d'insertion à l'aide de CTE inscriptibles dans une seule requête volumineuse.

Ce sera vraiment le moyen le plus rapide d’obtenir une copie des données. Cependant, cela prendra toujours un temps non nul; Les deux requêtes SELECT d'extraction des données prendront un certain temps, de même que l'insertion de milliers de lignes sur plusieurs tables. Vos façons de réduire ce temps sont l’optimisation générale des requêtes et des performances.

Si la manipulation fonctionne de telle sorte que l'utilisateur n'a pas besoin d'une copie des données, mais simplement d'un sous-ensemble actif des données, vous pouvez explorer l'utilisation de VIEW , y compris celles qui peuvent être mises à jour. Mais il semble que vous ayez besoin d'une copie.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi