L'instruction UPDATE permet de modifier les valeurs des colonnes dans les lignes correspondant à une condition donnée.
Syntaxe
UPDATE <table> [ * ] [ [ AS ] <alias> ]
SET { <column> = { <expression> } |
( <column> [, ...] ) = ( { <expression> } [, ...] ) } [, ...]
[ FROM <from_list> ]
[ WHERE <condition> ]
Paramètres
| Paramètre | Description |
|---|---|
table |
Nom de la table à mettre à jour. |
alias |
Alias de la table. |
column |
Nom de la colonne à mettre à jour. |
expression |
Expression générant la nouvelle valeur de la colonne. |
from_list |
Colonne de la table source, utilisée lors d'une mise à jour avec des données issues d'une autre table. |
condition |
Condition que les lignes doivent respecter pour être mises à jour. Les lignes ne satisfaisant pas cette condition restent inchangées. |
Pour consulter la spécification complète de l'instruction UPDATE dans PostgreSQL, reportez-vous à la page UPDATE.
Fonctionnement
Chaque table Hologres est associée à trois fichiers : un fichier de données, un fichier d'index de clé primaire et un fichier de tags. Les fichiers de tags servent principalement aux scénarios de suppression ou de mise à jour des données via les instructions DELETE, UPDATE, INSERT ON CONFLICT, etc. Pour en savoir plus sur le fichier d'index de clé primaire, consultez la rubrique PK.
Lors de l'exécution d'une instruction UPDATE, Hologres écrit d'abord les nouvelles données dans la table en mémoire (Mem Table), puis les vide de manière asynchrone sur le disque.
Tables orientées ligne : Les nouvelles données sont vidées dans un nouveau fichier. La compaction en arrière-plan fusionne ensuite les anciennes données.
Tables orientées colonne : Hologres construit en mémoire une table de tags enregistrant l'ID du fichier et l'ID de la ligne des données à remplacer. Les nouvelles données sont vidées dans un nouveau fichier et la table de tags dans un fichier de tags. Lors de la compaction, Hologres supprime les anciennes données et intègre les nouvelles.
La compaction étant asynchrone, l'espace de stockage utilisé augmente pendant l'exécution de l'instruction UPDATE, puis revient à la normale une fois la compaction terminée.
Les mises à jour sont plus efficaces sur les tables orientées ligne que sur les tables orientées colonne.
Tables avec une clé primaire
Si une table possède une clé primaire, Hologres utilise le fichier d'index de clé primaire pour rechercher l'identifiant de ligne (RID) et localiser directement les fichiers de données cibles. Il ignore ainsi les fichiers non pertinents et ne met à jour que les lignes correspondantes.
Sans clé primaire, Hologres doit analyser l'intégralité de la table pour trouver les lignes correspondantes, ce qui dégrade les performances. Pour plus d'informations, consultez la rubrique PK.
Mises à jour partielles
Une mise à jour partielle modifie uniquement un sous-ensemble des colonnes d'une ligne, laissant les autres inchangées. Spécifiques à Hologres, elles répondent à divers besoins métier. Bien que les trois formats de stockage les prennent en charge, leur gestion de la lecture avant écriture diffère :
| Format de stockage | Comportement de la mise à jour partielle |
|---|---|
| Orienté ligne | Écriture des données en mode Append Only via la structure log-structured merge (LSM). Aucune lecture avant écriture n'est requise. |
| Orienté colonne | Lecture obligatoire des colonnes vides avant l'écriture des nouvelles données, augmentant la consommation de ressources. |
| Hybride ligne-colonne | Lecture des colonnes vides depuis la partie orientée ligne, réduisant la consommation de ressources par rapport aux tables orientées colonne. |
Avec les plans fixes, le classement des performances des mises à jour partielles est le suivant (du plus rapide au plus lent) :
row-oriented > row-column hybrid > column-oriented
Sans plans fixes, les mises à jour partielles se comportent comme une jointure entre deux tables. Le classement des performances change alors :
column-oriented > row-column hybrid > row-oriented
Pour la plupart des charges de travail de mise à jour en temps réel avec plans fixes, les tables orientées ligne offrent les meilleures performances. Consultez la rubrique Instruction UPDATE pour savoir comment activer les plans fixes.
Limites
Impossible de mettre à jour les clés de distribution. Pour modifier la valeur d'une clé de distribution, supprimez la ligne et réinsérez-la avec la nouvelle valeur.
La mise à jour d'une table partitionnée affecte les tables enfants, pas la table parente. Exécutez l'instruction UPDATE sur la table enfant spécifique contenant les lignes à modifier.
Utilisez des plans fixes pour optimiser les performances. Sans plans fixes, les mises à jour partielles sont traitées comme des jointures de tables, ce qui modifie les caractéristiques de performance et le classement selon les formats de stockage. Consultez la rubrique Instruction UPDATE.
Exemples
Les exemples suivants s'appuient sur une table d'exemple :
CREATE TABLE update_test (
a text primary key,
b int not null,
c text not null,
d text
);
INSERT INTO update_test VALUES ('b1', 10, '', '');
Mettre à jour une colonne à l'aide d'une expression arithmétique
UPDATE update_test SET b = b + 10 WHERE a = 'b1';
Mettre à jour plusieurs colonnes selon une condition portant sur une autre colonne
UPDATE update_test SET c = 'new_' || a, d = null WHERE b = 20;
Mettre à jour plusieurs colonnes sans condition WHERE (met à jour toutes les lignes)
UPDATE update_test SET (b, c, d) = (1, 'test_c', 'test_d');
Mettre à jour une colonne à l'aide de données provenant d'une autre table
CREATE TABLE tmp (a int);
INSERT INTO tmp VALUES (2);
UPDATE update_test SET b = tmp.a FROM tmp;
Mise à jour partielle : mettre à jour une colonne et laisser les autres inchangées
CREATE TABLE update_test2 (
col1 text NOT NULL PRIMARY KEY,
col2 text,
col3 text
);
INSERT INTO update_test2 VALUES ('a1', 'a2', 'a3'), ('a11', 'a22', 'a33');
-- Update col2 only; col3 is unchanged
UPDATE update_test2 SET col2 = 'tom' WHERE col1 = 'a1';
Résultat :
col1 | col2 | col3
------+------+------
a1 | tom | a3
a11 | a22 | a33
(2 rows)
Vous pouvez également réaliser la même mise à jour partielle avec INSERT ON CONFLICT :
INSERT INTO update_test2 (col1, col2) VALUES ('a1', 'tom')
ON CONFLICT (col1) DO UPDATE
SET col2 = EXCLUDED.col2;
FAQ
Pourquoi l'utilisation du stockage augmente-t-elle brusquement pendant une opération UPDATE, puis diminue-t-elle ensuite ?

Pendant une opération UPDATE, Hologres marque les anciennes données pour suppression et vide immédiatement les nouvelles données dans de petits fichiers. Les anciennes données marquées et les nouveaux fichiers coexistent jusqu'à l'exécution de la compaction en arrière-plan. Celle-ci fusionne les nouvelles données, efface les anciennes et consolide les petits fichiers, ramenant l'utilisation du stockage à la normale. Consultez la section Fonctionnement pour plus de détails.