Jag är inte riktigt säker på vad din fråga är. Ja, enligt dessa två exekveringsplaner, i det här fallet har subquery-metoden en lägre förväntad kostnad. Verkar inte så förvånande, eftersom det kan använda indexet för att mycket snabbt hitta den exakta raden du är intresserad av. Specifikt i det här fallet behöver underfrågan bara göra en mycket snabb skanning av PK-indexet. Situationen kan vara annorlunda om underfrågan involverade kolumner som inte ingick i indexet.
Frågan som använder rank()
måste få alla matchande rader och rangordna dem. Jag tror inte att optimeraren har någon kortslutningslogik för att inse att detta är en fråga på topp-n och därför undviker en fullständig sortering, även om allt du verkligen bryr dig om är den högst rankade raden.
Du kan också prova det här formuläret, som optimeraren bör känna igen som en topp-n-fråga. Jag förväntar mig i ditt fall att det bara skulle kräva en enda intervallsökning på indexet följt av en tabellåtkomst.
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;