Vu l'update qui est fait:
set cli_mail = lower (cli_mail)
j'en déduit que le format standard est en minuscule et que donc les lignes à updater sont toutes celles qui ne sont pas encore en minuscule...
D'ou la clause :
where cli_mail != lower(cli_mail)
ce qui évitera d'updater toutes les lignes (peut être seulement 50 sur 2000000 pourquoi pas) mais n'évitera pas le full_table_scan.
Autrement dit Oracle se tapera bien toute la table pour trouver les lignes qui ne sont pas au bon format mais ne remontera en mémoire que les 50 lignes à modifier. (alors que sans la clause, il remontera toute la table en mémoire puisqu'il modifiera toutes les lignes).
Pour moi les deux plans d'exécution ne devraient pas être les même.(j'avoue que je n'ai pas eu le temps de vérifier)
Voilà l'interêt que je vois mais peut être que je me suis dans l'erreur concernant le fonctionnement du moteur d'Oracle.
Cette réflexion se base sur un exemple concret que j'utilise souvent sur une table de 500 000 lignes (cmf). le second des deux update suivants est en général beaucoup plus rapide que le premier.
1 2 3
| update cmf set acct_seg_id =10
update cmf set acct_seg_id = 10 where acct_seg_id <>10 |
Le mieux étant sans doute de formater toutes les insertions en lower mais si les incohérences sont déjà présentes la seule solution est d'updater les lignes.
Sinon effectivement des verrous pouraient expliquer la lenteur
Partager