2011-06-01 24 views
8

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?

+1

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

+0

@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. –

+0

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

Trả lời

6

Jonathan Lewis đã viết về các vấn đề với sysdate trong 9i; hãy xem phần 'sysdate đáng ngạc nhiên', ví dụ: here. Về cơ bản số học trên sysdate dường như gây nhầm lẫn cho trình tối ưu hóa, vì vậy trong trường hợp này, nó cho rằng chỉ mục trên mydate là có chọn lọc hơn. Điều này có vẻ giống như một ví dụ cực đoan mặc dù. (Ban đầu chỉ theo hướng này từ một bài viết không liên quan đến Ask Tom).

+1

Tôi ngạc nhiên ngay cả khi Oracle cho phép thông qua QA. –

+0

+1, tôi mơ hồ nhớ đọc về điều này nhưng không thể tìm thấy tài liệu tham khảo ;-) – DCookie

+0

Bạn có ý nghĩa chọn lọc hơn, thay vì ít chọn lọc hơn? – btilly

1

Tôi không biết Oracle, nhưng trong Postgresql, một nguồn có thể bỏ qua chỉ mục là các loại không phù hợp. Có thể làm thẳng - 5 làm cho Oracle nghĩ rằng rhs là số. Bạn có thể làm một diễn viên cho đến nay (hoặc bất cứ điều gì là chính xác loại mydate) trên sysdate - 5?

Các vấn đề liên quan