PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres réécrit-il la ligne entière lors de la mise à jour ?

Choisir c) à partir de vos questions :

Comme @Craig déjà expliqué , les colonnes "TOAST-able" et supérieures à un certain seuil sont stockées hors ligne dans une table TOAST dédiée par table (des "fourches de relation" séparées, des fichiers séparés sur le disque). Donc, un bytea de 5 Mo la colonne resterait pratiquement intacte dans une mise à jour si la colonne elle-même n'était pas modifiée. Le manuel :

Gras gras le mien.
La ligne dans la fourche de relation principale est toujours copiée et une ligne morte reste derrière lors de la mise à jour (que les valeurs aient ou non réellement changé). Pour les lignes de grande taille, la solution suivante peut s'avérer payante :

Créez un petit tableau 1:1 séparé pour les drapeaux fréquemment changés. Juste la clé primaire (=clé étrangère en même temps) et les drapeaux fréquemment changés. Cela rendrait les mises à jour beaucoup plus rapides et préserverait l'espace disque - pour une surcharge initiale supplémentaire et un certain coût pour les requêtes qui doivent joindre les deux tables (les autres requêtes deviennent en fait plus rapides). En savoir plus sur l'espace disque requis pour les lignes du tableau :