Jeg er ikke helt sikker på, hvad dit spørgsmål er. Ja, ifølge disse to eksekveringsplaner har underforespørgselsmetoden i dette tilfælde lavere forventede omkostninger. Det virker ikke så overraskende, da det kan bruge indekset til meget hurtigt at finde den nøjagtige række, du er interesseret i. Specifikt i dette tilfælde skal underforespørgslen kun lave en meget hurtig scanning af PK-indekset. Situationen kan være anderledes, hvis underforespørgslen involverede kolonner, der ikke var en del af indekset.
Forespørgslen ved hjælp af rank()
skal hente alle de matchende rækker og rangere dem. Jeg tror ikke på, at optimeringsværktøjet har nogen kortslutningslogik til at genkende, at dette er en top-n-forespørgsel og derfor undgå en fuld sortering, selvom det eneste, du virkelig bekymrer dig om, er den toprangerede række.
Du kan også prøve denne formular, som optimeringsværktøjet burde genkende som en top-n-forespørgsel. Jeg ville forvente i dit tilfælde, at det kun ville kræve en enkelt rækkeviddescanning på indekset efterfulgt af en tabeladgang.
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;