par Guillaume Lelarge.

Suppression


Contrairement à la requête insert, la requête delete a une clause where qui peut utiliser toutes les méthodes décrites dans le Chapitre 2, « La clause Where » pour bénéficier directement des index. En fait, la requête delete fonctionne comme une requête select suivie d'une étape supplémentaire de suppression des lignes identifiées.

La suppression réelle d'une ligne suit un traitement similaire à l'insertion d'une ligne, tout spécialement la suppression des références enregistrées dans les index et la conservation de la propriété balancée des index. Le graphe de performances montré en Figure 8.2 est de ce fait très similaire à celui montré pour l'insert.

Figure 8.2 Performance des suppressions suivant le nombre d'index

En théorie, nous devons nous attendre à avoir les meilleures performances pour un delete sur une table sans index, exactement comme pour les insert. Néanmoins, sans index, la base de données doit lire la table entière pour trouver les lignes à supprimer. Cela signifie que la suppression d'une ligne est rapide, mais la trouver est bien plus long. Ce cas n'est pas montré dans la Figure 8.2.

Il peut être sensé d'exécuter une requête delete sans index tout comme il peut être sensé d'exécuter une requête select sans index si elle renvoie une grande partie de la table.

Astuce

Même les requêtes delete et update ont un plan d'exécution.

Une requête delete sans clause where est un exemple évident pour lequel la base de données ne peut pas utiliser un index. Cependant, c'est un cas très particulier qui a même sa propre commande SQL : truncate table. Cette commande a le même effet que delete sans la clause where, sauf qu'elle supprime toutes les lignes en un coup. Cette commande est très rapide mais elle a deux effets de bord importants : (1) elle exécute un commit implicite (avec une exception pour PostgreSQL) ; (2) elle n'exécute aucun trigger.

Effets de bord de MVCC

Le système MVCC (pour « Multiversion concurrency control ») est un mécanisme de base de données qui permet un accès aux données en parallèle non bloquant et une vue cohérente de la base. Les implémentations diffèrent suivant la base de données et peuvent avoir des effets considérables sur les performances.

Par exemple, la base de données PostgreSQL conserve les informations de version (aussi appelées informations de visibilité) au niveau de la table : supprimer une ligne ne fait que mettre à 1 le drapeau « supprimée » dans le bloc de la table. Les performances d'une requête delete avec PostgreSQL ne dépendent donc pas du nombre d'index sur la table. La suppression physique de la ligne dans la table et la maintenance relative de l'index sont réalisées lors du VACUUM .

À propos de l'auteur

Photo de Markus Winand

Markus Winand teaches efficient SQL—inhouse and online. He minimizes the development time using modern SQL and optimizes the runtime with smart indexing—for that he also published the book SQL Performance Explained.

Livre de Markus

Couverture du livre « SQL : Au cœur des performances »

L'essence de SQL tuning dans 200 pages.

Acheter de Markus
(Livre de poche et PDF)

Achetez chez Amazon
(Seulement en poche)

“Use The Index, Luke!” by Markus Winand and translated by Guillaume Lelarge is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Mentions légales | Contact | NO WARRANTY | Marque déposée | Privacy | CC-BY-NC-ND 3.0 license