あなたの質問が何であるかはよくわかりません。はい、これら2つの実行プランによると、この場合、サブクエリメソッドの予想コストは低くなります。インデックスを使用して、関心のある正確な行を非常にすばやく見つけることができるため、それほど驚くことではありません。特にこの場合、サブクエリはPKインデックスの非常に迅速なスキャンを実行するだけで済みます。サブクエリにインデックスの一部ではない列が含まれている場合は、状況が異なる可能性があります。
rank()
を使用したクエリ 一致するすべての行を取得してランク付けする必要があります。オプティマイザーには、これがトップnクエリであることを認識するための短絡ロジックがあるとは思わないため、本当に気になるのはトップランクの行だけですが、完全な並べ替えは避けてください。
このフォームを試すこともできます。オプティマイザーはこれをトップnクエリとして認識する必要があります。あなたの場合、インデックスの範囲スキャンが1回だけで、その後にテーブルアクセスが必要になると思います。
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;