Bonjour,
J'ai lu qu'il était plus performant de faire un Select avec une clause With dans le cas où une même sous-requête est exécutée N fois plutôt que de laisser l'optimiseur d'Oracle se débrouiller seul.
MAIS j'avoue que cela me laisse perplexe...
Ce que j'ai compris c'est que Oracle va créer une vue avec le résultat de la sous-requête du WITH et il utilisera cette vue à chaque appel de la sous-requête, donc il lira les données en mémoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 WITH sub_req1 AS (SELECT max(salary) FROM stagiaires) SELECT first_name, last_name FROM employees WHERE commission_pct>sub_req1 AND salary<sub_req1;
Ce que je ne comprends pas c'est pourquoi c'est plus rapide que l'action faite sans WITH. Je pensais que Oracle exécutait la requête
une première fois, un process serveur charge les données du disque dur vers la SGA et au deuxième appel de la même requête Oracle ne va pas relire les données sur le disque dur car il sait qu'elles sont déjà en SGA, il va donc relire celles déjà stockées et, de plus, il ne va pas ré-analyser la requête (parsing) car il l'a déjà fait une fois donc il a mémorisé cette étape d'où un gain de temps.
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT max(salary) FROM stagiaires
En réfléchissant je me dis que la vue est mise à jour en temps réel alors que les données en SGA peuvent ne pas refléter la dernière version de données entre le premier appel et le suivant mais cela me semblerait être un manque de chance car une requête pas trop lourde s'exécute "en général" très rapidement. Dans ce cas, il faudra effectivement que Oracle teste si les données en SGA sont en décalage avec celles du disque dur ou bien si une autre transaction dans un autre bloc de SGA a modifié les données sur lesquelles on travaille MAIS, sauf erreur de ma part, Oracle pratique la lecture cohérente donc même si les données sont modifiées par un autre user entre les différents appels, Oracle utilisera toujours dans ma transaction les données récupérées dans le premier appel, qu'on utilise la clause WITH ou non.
Comme vous le voyez ce n'est pas très clair pour moi, j'aimerai donc avoir vos lumières sur ce sujet.
Partager