Được - Tôi sẽ dùng thử, đây chủ yếu là khoản khấu trừ từ Thông tin có sẵn:
Tại sao Oracle chọn một kế hoạch thực thi khác?
Có vẻ như trong truy vấn thứ hai của bạn với Định dạng ngày bất thường, trình tối ưu hóa không biết giá trị của ngày kết quả là gì. Bạn thấy Vị từ bộ lọc:
1 - bộ lọc (TO_DATE ('20140610', 'yyyymmdd') <=TO_DATE ('2014-06-10 23:59:59', 'syyyy-mm-dd hh24:mi:ss'))
Có nghĩa là trình tối ưu hóa thậm chí không chắc chắn rằng ngày đầu tiên nhỏ hơn ngày thứ hai! Điều đó có nghĩa là trình tối ưu hóa không có ý tưởng về số lượng hàng được trả lại và sẽ chỉ sử dụng một kế hoạch chung chung mà không tính đến thống kê cụ thể. Nó sẽ giống như vậy nếu bạn có một hàm do người dùng xác định xyt () sẽ trả về một ngày cho phạm vi. Trình tối ưu hóa không có cách nào để biết giá trị ngày nào sẽ dẫn đến - Điều này có nghĩa là bạn nhận được một kế hoạch tổng thể cho tất cả các mục đích, sẽ khá tốt cho bất kỳ phạm vi ngày nào được chỉ định.
Trong trường hợp đầu tiên và thứ ba, trình tối ưu hóa dường như hiểu ngày trực tiếp và có thể đoán số hàng trong phạm vi ngày bằng cách sử dụng thống kê. Vì vậy, trong khi Truy vấn thứ hai dành cho Trình tối ưu hóa như GIỮA X VÀ 3
Truy vấn này giống như GIỮA 1 VÀ 3
Vì vậy, anh ấy tối ưu hóa kế hoạch truy vấn cho số lượng hàng được trả lại dự đoán!
Điều kỳ lạ dường như là, trình tối ưu hóa truy vấn gặp vấn đề như vậy với định dạng ngày kỳ lạ, có thể được gửi dưới dạng lỗi / yêu cầu cải thiện ...
Nhưng một điểm quan trọng:
- Việc quét toàn bộ bảng không nhất thiết phải là một kế hoạch XẤU ... Cũng như việc sử dụng một chỉ mục không phải lúc nào cũng nhanh hơn!
- Chi phí trong kế hoạch truy vấn không có liên quan trực tiếp đến thời gian thực hiện hoặc hiệu suất thực tế - nó là một phép đo nội bộ để so sánh các kế hoạch khác nhau cho cùng một CÂU HỎI (Vì vậy, bạn không thể so sánh chi phí của các truy vấn khác nhau như truy vấn của bạn 1 , 2 và 3)
Về cơ bản, nếu bạn trả về một số lượng hàng cao từ một bảng thì việc quét toàn bộ bảng mà không có quyền truy cập chỉ mục trong nhiều trường hợp sẽ nhanh hơn nhiều, đặc biệt là khi hoạt động trên một số phân vùng nhất định! - Quét Bảng sẽ chỉ truy cập phân vùng cho phạm vi ngày phù hợp - vì vậy chỉ cho ngày được đề cập và trả về tất cả các hàng từ phân vùng này. Điều này nhanh hơn nhiều so với việc queriyng lập chỉ mục cho từng hàng đơn lẻ và sau đó trích xuất hàng bằng quyền truy cập chỉ mục ... Hãy thử lập hồ sơ các truy vấn - quá trình quét toàn bộ bảng trên phân vùng sẽ nhanh gấp 3 lần với IO ít hơn nhiều