Bạn có nhận được các kế hoạch truy vấn khác nhau khi bao gồm gợi ý không? Giả định của tôi là bạn làm dựa trên mô tả của bạn về vấn đề.
Khi bạn thực thi một truy vấn trong Oracle, cơ sở dữ liệu thường không hiện thực hóa toàn bộ kết quả được đặt tại bất kỳ thời điểm nào (rõ ràng, nó có thể phải thực hiện nếu bạn chỉ định một ORDER BY
mệnh đề yêu cầu tất cả dữ liệu phải được cụ thể hóa trước khi sắp xếp xảy ra). Oracle không thực sự bắt đầu hiện thực hóa dữ liệu cho đến khi máy khách bắt đầu tìm nạp dữ liệu. Nó chạy đủ truy vấn để tạo ra tuy nhiên nhiều hàng mà khách hàng đã yêu cầu tìm nạp (nghe có vẻ như là 10 trong trường hợp của bạn), trả về các kết quả đó cho khách hàng và đợi khách hàng yêu cầu thêm dữ liệu trước khi tiếp tục xử lý truy vấn.
Nó giống như khi FIRST_ROWS
gợi ý được bao gồm, kế hoạch truy vấn đang thay đổi theo cách làm cho nó đắt hơn để thực thi. Rõ ràng, đó không phải là mục tiêu của FIRST_ROWS
dấu. Mục đích là để yêu cầu trình tối ưu hóa tạo ra một kế hoạch làm cho việc tìm nạp N hàng đầu tiên hiệu quả hơn ngay cả khi nó làm cho việc tìm nạp tất cả các hàng từ truy vấn kém hiệu quả hơn. Điều đó có xu hướng khiến trình tối ưu hóa ưu tiên những thứ như quét chỉ mục hơn quét bảng trong đó quét bảng nhìn chung có thể hiệu quả hơn. Có vẻ như trong trường hợp của bạn, tuy nhiên, ước tính của trình tối ưu hóa không chính xác và nó kết thúc bằng việc chọn một kế hoạch nói chung là kém hiệu quả hơn. Điều đó thường ngụ ý rằng một số thống kê về một số đối tượng mà truy vấn của bạn đang tham chiếu là không đầy đủ hoặc không chính xác.