DELETE supprime les lignes de la table [db.]table qui correspondent à l’expression expr. Elle n’est disponible que pour les moteurs de table de la famille *MergeTree.
DELETE” pour le distinguer de la commande ALTER TABLE … DELETE, qui est une opération lourde.
Exemples
Lightweight DELETE ne supprime pas immédiatement les données
DELETE est implémenté sous forme d’une mutation qui marque les lignes comme supprimées, sans les supprimer physiquement immédiatement.
Par défaut, les instructions DELETE attendent que le marquage des lignes comme supprimées soit terminé avant de se terminer. Cela peut prendre beaucoup de temps si le volume de données est important. Vous pouvez également l’exécuter de façon asynchrone en arrière-plan à l’aide du paramètre lightweight_deletes_sync. S’il est désactivé, l’instruction DELETE se termine immédiatement, mais les données peuvent rester visibles dans les requêtes jusqu’à la fin de la mutation en arrière-plan.
La mutation ne supprime pas physiquement les lignes marquées comme supprimées ; cela ne se produira qu’au moment de la prochaine fusion. Par conséquent, il est possible que, pendant une période indéterminée, les données ne soient pas réellement supprimées du stockage et soient seulement marquées comme supprimées.
Si vous devez garantir que vos données soient supprimées du stockage dans un délai prévisible, envisagez d’utiliser le paramètre de table min_age_to_force_merge_seconds. Vous pouvez également utiliser la commande ALTER TABLE … DELETE. Notez que la suppression de données à l’aide de ALTER TABLE ... DELETE peut consommer des ressources importantes, car elle recrée toutes les parts affectées.
Suppression de grandes quantités de données
TRUNCATE TABLE.
Si vous prévoyez des suppressions fréquentes, envisagez d’utiliser une clé de partitionnement personnalisée. Vous pourrez ensuite utiliser la commande ALTER TABLE ... DROP PARTITION pour supprimer rapidement toutes les lignes associées à cette partition.
Limitations du Lightweight DELETE
Lightweight DELETE avec projections
DELETE ne fonctionne pas sur les tables avec projections. En effet, les lignes d’une projection peuvent être affectées par une opération DELETE. Cependant, le paramètre MergeTree lightweight_mutation_projection_mode permet de modifier ce comportement.
Considérations relatives aux performances lors de l’utilisation de Lightweight DELETE
DELETE peut dégrader les performances des requêtes SELECT.
Les facteurs suivants peuvent également dégrader les performances de Lightweight DELETE :
- Une condition
WHEREcomplexe dans une requêteDELETE. - Si la file d’attente des mutations contient de nombreuses autres mutations, cela peut entraîner des problèmes de performance, car toutes les mutations d’une table sont exécutées de manière séquentielle.
- La table concernée comporte un très grand nombre de part de données.
- Un volume important de données dans des part compactes. Dans une partie compacte, toutes les colonnes sont stockées dans un seul fichier.
Autorisations de suppression
DELETE nécessite le privilège ALTER DELETE. Pour autoriser les instructions DELETE sur une table spécifique pour un utilisateur donné, exécutez la commande suivante :
Fonctionnement interne des Lightweight DELETE dans ClickHouse
-
Un « masque » est appliqué aux lignes affectées
Lorsqu’une requête
DELETE FROM table ...est exécutée, ClickHouse enregistre un masque dans lequel chaque ligne est marquée soit comme « existante », soit comme « supprimée ». Ces lignes « supprimées » sont alors omises des requêtes suivantes. Cependant, les lignes ne sont réellement supprimées que plus tard, lors des fusions ultérieures. L’écriture de ce masque est bien plus lightweight que ce qui est effectué par une requêteALTER TABLE ... DELETE. Le masque est implémenté sous la forme d’une colonne système cachée_row_existsqui stockeTruepour toutes les lignes visibles etFalsepour celles qui sont supprimées. Cette colonne n’est présente dans une part que si certaines lignes de cette part ont été supprimées. Cette colonne n’existe pas lorsqu’une part a toutes ses valeurs égales àTrue. -
Les requêtes
SELECTsont transformées pour inclure le masque Lorsqu’une colonne masquée est utilisée dans une requête, la requêteSELECT ... FROM table WHERE conditionest, en interne, étendue par le prédicat sur_row_existset transformée en :Au moment de l’exécution, la colonne_row_existsest lue pour déterminer quelles lignes ne doivent pas être renvoyées. S’il y a beaucoup de lignes supprimées, ClickHouse peut déterminer quels granules peuvent être entièrement ignorés lors de la lecture du reste des colonnes. -
Les requêtes
DELETEsont transformées en requêtesALTER TABLE ... UPDATEDELETE FROM table WHERE conditionest traduit en mutationALTER TABLE table UPDATE _row_exists = 0 WHERE condition. En interne, cette mutation est exécutée en deux étapes :-
Une commande
SELECT count() FROM table WHERE conditionest exécutée pour chaque part individuelle afin de déterminer si la part est affectée. -
Sur la base des commandes ci-dessus, les parts affectées sont ensuite mutées, et des liens physiques (hardlinks) sont créés pour les parts non affectées. Dans le cas des wide parts, la colonne
_row_existsde chaque ligne est mise à jour, et les fichiers de toutes les autres colonnes sont conservés via hardlink. Pour les compact parts, toutes les colonnes sont réécrites, car elles sont toutes stockées ensemble dans un seul fichier.
DELETEutilisant la technique du masquage améliore les performances par rapport auALTER TABLE ... DELETEtraditionnel, car il ne réécrit pas les fichiers de toutes les colonnes pour les parts affectées. -
Une commande