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.