Не съм много сигурен какъв е въпросът ти. Да, според тези два плана за изпълнение, в този случай методът на подзаявката има по-ниска очаквана цена. Не изглежда твърде изненадващо, тъй като може да използва индекса, за да намери много бързо точния ред, който ви интересува. По-конкретно в този случай, подзаявката трябва да направи само много бързо сканиране на PK индекса. Ситуацията може да е различна, ако подзаявката включва колони, които не са част от индекса.
Заявката, използваща rank()
трябва да получи всички съвпадащи редове и да ги класира. Не вярвам, че оптимизаторът има някаква логика на късо съединение, за да разпознае, че това е заявка с най-висок клас и следователно да избегне пълно сортиране, въпреки че всичко, което наистина ви интересува, е най-високо класираният ред.
Можете също така да опитате този формуляр, който оптимизаторът трябва да разпознае като запитване от първо място. Бих очаквал във вашия случай, че ще изисква само едно сканиране на диапазон на индекса, последвано от достъп до таблица.
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;