Thứ tự mà Oracle đánh giá các điều kiện được tìm thấy trong mệnh đề where không được cố định. Điều đó có nghĩa là nó có thể chọn đánh giá điều kiện chứa TO_DATE trước các tiêu chí khác, trong trường hợp đó truy vấn sẽ không thành công. Để tránh điều đó, hãy thêm gợi ý Order_predicates vào truy vấn của bạn, nhưng lưu ý rằng điều này có thể yêu cầu điều chỉnh thủ công bổ sung để cải thiện hiệu suất.
SELECT /*+ ordered_predicates */
To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') somedate
FROM properties$aud a,
template_properties$aud b,
consumable_properties$aud c
WHERE Lower(a.name) = 'somedate'
AND a.id = b.property_id
AND b.id = c.template_property_id
AND To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') IS NOT NULL
Rõ ràng là ordered_predicates
không được dùng nữa bắt đầu bằng 10g. Trong trường hợp đó, tôi nghĩ lựa chọn duy nhất của bạn là sử dụng truy vấn phụ theo cách mà trình tối ưu hóa buộc phải đánh giá nó trước (tức là nó không thể kết hợp các truy vấn). Cách dễ nhất để làm điều này là đặt rownum
trong câu lệnh where của truy vấn bên trong.
SELECT To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') somedate
FROM (SELECT value
FROM properties$aud a,
template_properties$aud b,
consumable_properties$aud c
WHERE Lower(a.name) = 'somedate'
AND a.id = b.property_id
AND b.id = c.template_property_id
AND rownum > 0)
WHERE To_Date(c.Value, 'MM/DD/YYYY HH24:MI:SS') IS NOT NULL