Não tenho muita certeza de qual é a sua pergunta. Sim, de acordo com esses dois planos de execução, neste caso, o método de subconsulta tem um custo esperado menor. Não parece muito surpreendente, pois pode usar o índice para localizar rapidamente a linha exata em que você está interessado. Especificamente neste caso, a subconsulta só precisa fazer uma varredura muito rápida do índice PK. A situação pode ser diferente se a subconsulta envolver colunas que não fazem parte do índice.
A consulta usando
rank()
tem que obter todas as linhas correspondentes e classificá-las. Eu não acredito que o otimizador tenha qualquer lógica de curto-circuito para reconhecer que esta é uma consulta top-n e, portanto, evitar uma classificação completa, mesmo que tudo o que você realmente se importe seja a linha mais bem classificada. Você também pode tentar este formulário, que o otimizador deve reconhecer como uma consulta top-n. Eu esperaria que, no seu caso, exigisse apenas uma única varredura de intervalo no índice, seguida de um acesso à tabela.
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;