Nie jestem do końca pewien, jakie jest twoje pytanie. Tak, zgodnie z tymi dwoma planami wykonania, w tym przypadku metoda podzapytania ma niższy oczekiwany koszt. Nie wydaje się to zbyt zaskakujące, ponieważ może użyć indeksu do bardzo szybkiego zlokalizowania dokładnego wiersza, który Cię interesuje. W szczególności w tym przypadku podzapytanie musi wykonać tylko bardzo szybkie skanowanie indeksu PK. Sytuacja może być inna, jeśli podzapytanie dotyczyło kolumn, które nie były częścią indeksu.
Zapytanie używające rank()
musi zebrać wszystkie pasujące wiersze i uszeregować je. Nie wierzę, że optymalizator ma jakąkolwiek logikę zwarcia, aby rozpoznać, że jest to zapytanie o najwyższym n i dlatego unika pełnego sortowania, nawet jeśli tak naprawdę zależy ci tylko na wierszu z najwyższej pozycji.
Możesz również wypróbować ten formularz, który optymalizator powinien rozpoznać jako zapytanie o top-n. Spodziewałbym się, że w twoim przypadku będzie to wymagało tylko pojedynczego skanowania zakresu indeksu, a następnie dostępu do tabeli.
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;