Tôi không thực sự chắc chắn câu hỏi của bạn là gì. Có, theo hai kế hoạch thực thi này, trong trường hợp này, phương thức truy vấn con có chi phí dự kiến thấp hơn. Có vẻ không quá ngạc nhiên, vì nó có thể sử dụng chỉ mục để định vị rất nhanh hàng chính xác mà bạn quan tâm. Cụ thể trong trường hợp này, truy vấn con chỉ phải quét rất nhanh chỉ mục PK. Tình huống có thể khác nếu truy vấn con liên quan đến các cột không phải là một phần của chỉ mục.
Truy vấn sử dụng rank()
phải lấy tất cả các hàng phù hợp và xếp hạng chúng. Tôi không tin rằng trình tối ưu hóa có bất kỳ logic ngắn mạch nào để nhận ra rằng đây là một truy vấn top-n và do đó, tránh một loại đầy đủ, mặc dù tất cả những gì bạn thực sự quan tâm là hàng được xếp hạng cao nhất.
Bạn cũng có thể thử biểu mẫu này, mà trình tối ưu hóa sẽ nhận ra là một truy vấn top-n. Trong trường hợp của bạn, tôi mong đợi rằng nó sẽ chỉ yêu cầu một lần quét phạm vi duy nhất trên chỉ mục, sau đó là quyền truy cập bảng.
select *
from (select *
from teste_rank r
where data_mov <= trunc(sysdate)
and codigo = 1
order by data_mov desc)
where rownum=1;