Oracle
 sql >> Base de données >  >> RDS >> Oracle

Performances :rang() vs sous-requête. La sous-requête a un coût inférieur ?

Je ne sais pas vraiment quelle est votre question. Oui, selon ces deux plans d'exécution, dans ce cas, la méthode de sous-requête a un coût prévu inférieur. Cela ne semble pas trop surprenant, car il peut utiliser l'index pour localiser très rapidement la ligne exacte qui vous intéresse. Plus précisément dans ce cas, la sous-requête n'a qu'à effectuer une analyse très rapide de l'index PK. La situation pourrait être différente si la sous-requête impliquait des colonnes qui ne faisaient pas partie de l'index.

La requête utilisant rank() doit obtenir toutes les lignes correspondantes et les classer. Je ne crois pas que l'optimiseur ait une logique de court-circuit pour reconnaître qu'il s'agit d'une requête top-n et donc éviter un tri complet, même si tout ce qui vous intéresse vraiment est la ligne la mieux classée.

Vous pouvez également essayer ce formulaire, que l'optimiseur doit reconnaître comme une requête top-n. Je m'attendrais dans votre cas à ce qu'il ne nécessite qu'un seul balayage de plage sur l'index suivi d'un accès à la table.

select * 
  from (select *
          from teste_rank r
          where data_mov <= trunc(sysdate) 
            and codigo = 1
        order by data_mov desc)
  where rownum=1;