Selon le nombre d'ensembles de données différents, une option serait de partitionner les tables par ensemble de données.
Lorsqu'un ensemble de données est mis à jour, BEGIN
une nouvelle transaction, TRUNCATE
la table, COPY
les nouvelles données qu'il contient et COMMIT
. PostgreSQL a une optimisation où l' COPY
entrée dans une table qui a été TRUNCATE
d dans la même transaction fait beaucoup moins d'E / S si vous utilisez wal_level = minimal
(la valeur par défaut).
Si vous ne pouvez pas partitionner et tronquer (par exemple, si vous avez affaire à des dizaines ou des centaines de milliers d'ensembles de données, où il y aurait simplement trop de tables), vous voudrez plutôt activer le vide automatique pour qu'il s'exécute autant que possible. , assurez-vous d'avoir de bons index sur tout ce que vous supprimez et soyez prêt pour des performances quelque peu ordinaires.
Si vous n'avez pas besoin de sécurité en cas de crash - cela ne vous dérange pas que vos tables soient vides après un crash du système - vous pouvez également créer vos tables en tant que UNLOGGED
, ce qui vous fera économiser une énorme quantité d'E / S.
Si cela ne vous dérange pas de devoir restaurer l'intégralité de la configuration à partir d'une sauvegarde après un crash système, vous pouvez aller plus loin et également définir fsync=off
, ce qui dit à PostgreSQL "ne vous embêtez pas avec la sécurité en cas de crash, j'ai de bonnes sauvegardes et je ne peu m'importe si mes données sont définitivement et totalement irrécupérables après un crash, et je suis heureux de le ré- initdb
avant de pouvoir réutiliser ma base de données ".
J'ai écrit un peu plus à ce sujet dans un fil similaire sur Stack Overflow sur l' optimisation de PostgreSQL pour des tests rapides ; qui mentionne l'optimisation du système d'exploitation hôte, séparant WAL sur un autre disque si vous n'utilisez pas de unlogged
tables, d'ajustements de pointeur de contrôle, etc.
Il existe également des informations dans les documents Pg pour un chargement rapide des données et des paramètres non durables .
SIGKILL
édité, etc.) toutes lesUNLOGGED
tables peuvent êtreTRUNCATE
d, donc elles sont vides au démarrage. Ils ne sont pas tronqués après un arrêt et un redémarrage propres, mais vous ne devez pas vous fier à leur durabilité.UNLOGGED
option par table est tout simplement génial.TRUNCATE
ou deDROP/CREATE TABLE
séquence?TRUNCATE
personnellement. Le taux de désabonnement DDL a ses propres coûts. Étant donné que vous apportez des modifications avec une fréquence aussi élevée, il sera très important de vous assurer que vous augmentez l'agressivité d'Autovacuumpg_catalog.pg_class
et d'autres tables système qui pourraient gonfler sous cette charge de travail.