Fonctionnement et performances -- WHERE date = (SELECT MAX(date)
Bonjour,
Je voudrai me cultiver un peu :)
Mettons une requête de ce genre :
Code:
1 2 3 4 5 6
| SELECT *
FROM LOG_BOOK t1
WHERE DATE_TIME = (SELECT MAX(DATE_TIME)
FROM LOG_BOOK t2
WHERE t1.EVENT_ID = t2.EVENT_ID
AND s1.STATUS = s2.STATUS); |
La table est un journal qui contient l'historique des statuts de chaque événement. Quand un événement a eu plusieurs fois le même statut, on ne veut garder que le plus récent.
J'aimerai comprendre comment Oracle traite les sous-requêtes car j'ai l'impression que ce genre de chose peut vite devenir un gouffre à performances. De manière générale, comment sont traitées les sous-requêtes ? Une exécution pour chaque ligne de la requête principale en filtrant sur l'EVENT_ID ? Une seule exécution puis un JOIN sur EVENT_ID ? Les deux sont possibles selon ce que l'optimiseur pense le plus performant ?
Il n'y a pas des problèmes de cardinalité qui peuvent induire l'optimiseur en erreur sur ce genre de requête ?
Selon le fonctionnement d'Oracle, quelles sont les pistes d'optimisation de ce genre de requête ?
Merci par avance :ccool: