Tại sao có sự khác biệt lớn về hiệu suất giữa hai truy vấn này?Sự khác biệt lớn về hiệu suất: Sử dụng sysdate vs sử dụng ngày được định dạng trước
-- (89 seconds)
SELECT max(mydate) FROM mytable WHERE eqpid = 'ABCDEFG'
AND mydate < sysdate - 5
vs
-- (0.6 seconds)
SELECT max(mydate) FROM mytable WHERE eqpid = 'ABCDEFG'
AND mydate < TO_DATE('05/27/2011 03:13:00', 'MM/DD/YYYY HH24:MI:SS') -- 5 days ago
Bất kể chỉ số, có vẻ như cả hai to_date và sysdate chỉ trả lại "một số giá trị ngày tháng".
Lưu ý: Chỉ mục tổng hợp tồn tại trên bảng này bao gồm eqpid và 2 cột khác. Một chỉ mục cũng tồn tại cho mydate. Cả hai đều là b-tree. Có khoảng 29 triệu hàng.
Tại sao trình tối ưu hóa chọn một kế hoạch rõ ràng khác nhau (và trong một trường hợp, khủng khiếp) cho những điều này?
Danh sách các cột trong chỉ mục cho 'eqpid' là gì? Là một chỉ mục kết hợp với 'eqpid' xuống danh sách các cột? Nếu vậy thì Oracle có thể nghĩ rằng nó không phải là một chỉ mục kiểu hiệu quả để sử dụng, và vì vậy nó sẽ phạt tiền cho kế hoạch đó. – btilly
@btilly: Khóa chính kết hợp trong trường hợp này bao gồm 3 cột: eqpid (varchar2 8 byte), rectype (varchar1 1 byte), serialnobyte (số). Đó là sự hiểu biết của tôi rằng eqpid, cái đầu tiên trong khóa, có thể sử dụng chỉ mục. –
Vâng, nó sẽ có thể làm như vậy, và đã làm trong truy vấn thứ hai. Nhưng bạn rõ ràng có rất nhiều hàng với eqpid đó, và nó phải tránh xa nó khi nó nghĩ rằng nó có một sự thay thế. Trình tối ưu hóa có thể làm những điều kỳ lạ. (Nhưng tôi nhớ nó khi tôi cần phải làm cho MySQL chạy các truy vấn phức tạp.) – btilly