Urutan bahwa Oracle mengevaluasi kondisi yang ditemukan di klausa where tidak diperbaiki. Artinya, ia dapat memilih untuk mengevaluasi kondisi yang berisi TO_DATE sebelum kriteria lainnya, dalam hal ini kueri akan gagal. Untuk mencegahnya, tambahkan petunjuk orders_predicates ke kueri Anda, tetapi perlu diketahui bahwa ini mungkin memerlukan penyetelan manual tambahan untuk meningkatkan kinerja.
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
Rupanya ordered_predicates
sudah usang dimulai dengan 10g. Dalam hal ini, saya pikir satu-satunya pilihan Anda adalah menggunakan sub-kueri sedemikian rupa sehingga pengoptimal dipaksa untuk mengevaluasinya terlebih dahulu (yaitu tidak dapat menggabungkan kueri). Cara termudah untuk melakukannya adalah dengan meletakkan rownum
dalam pernyataan where dari kueri dalam.
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