Sélection des 10 meilleurs enregistrements Oracle : filtrage, classement et optimisation
Récupérer les dix premiers enregistrements dans Oracle est généralement simple, mais l'ajout de filtres et la priorisation des performances présentent des défis. Une récente question Stack Overflow l'a souligné, en se concentrant sur la sélection des dix premiers enregistrements en fonction d'une colonne spécifique tout en excluant les enregistrements répondant à une certaine condition.
La requête originale et ses lacunes
La requête SQL initiale visait à sélectionner des enregistrements uniques en fonction de plusieurs critères : capacité de stockage non nulle, exclusion des enregistrements d'une date précise et ordre décroissant par capacité de stockage. Cependant, la requête n'a pas réussi à limiter correctement les résultats aux dix premiers.
<code class="language-sql">SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') </code>
Ajouter simplement ROWNUM <= 10
à cette requête ne produirait pas le top 10 correct car ROWNUM
est attribué avant que la clause ORDER BY
soit traitée.
La solution : une approche de sous-requête
La solution efficace utilisait une sous-requête pour appliquer correctement le filtrage et le classement :
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009') ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10</code>
Cette structure imbriquée garantit que les enregistrements sont classés en premier, puis les dix premiers sont sélectionnés.
Améliorations des performances
Au-delà de la correction de commande, l'utilisation de EXISTS
au lieu de NOT IN
améliore considérablement les performances. EXISTS
offre généralement de meilleures opportunités d'optimisation, minimisant les jointures et améliorant la vitesse d'exécution des requêtes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!