Ik weet niet precies wat je vraag is. Ja, volgens deze twee uitvoeringsplannen heeft de subquerymethode in dit geval lagere verwachte kosten. Dat lijkt niet zo verwonderlijk, omdat het de index kan gebruiken om heel snel de exacte rij te vinden waarin je geïnteresseerd bent. Vooral in dit geval hoeft de subquery slechts een heel snelle scan van de PK-index uit te voeren. De situatie kan anders zijn als de subquery kolommen bevat die geen deel uitmaken van de index.
De zoekopdracht met rank()
moet alle overeenkomende rijen krijgen en rangschikken. Ik geloof niet dat de optimizer kortsluitlogica heeft om te herkennen dat dit een top-n-query is en daarom een volledige sortering vermijdt, hoewel het enige waar je echt om geeft de rij met de hoogste rangorde is.
U kunt ook dit formulier proberen, dat de optimizer zou moeten herkennen als een top-n-query. Ik zou in jouw geval verwachten dat het slechts een enkele scan van het bereik op de index zou vereisen, gevolgd door een tabeltoegang.
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;