Kolejność, w której Oracle ocenia warunki zawarte w klauzuli WHERE, nie jest ustalona. Oznacza to, że może wybrać ocenę warunku zawierającego TO_DATE przed innymi kryteriami, w którym to przypadku zapytanie zakończy się niepowodzeniem. Aby temu zapobiec, dodaj do zapytania wskazówkę order_predicates, ale pamiętaj, że może to wymagać dodatkowego ręcznego dostrojenia w celu poprawy wydajności.
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
Podobno ordered_predicates
jest przestarzały począwszy od 10g. W takim przypadku myślę, że jedyną opcją jest użycie podzapytania w taki sposób, aby optymalizator był zmuszony najpierw je ocenić (tzn. nie mógł połączyć zapytań). Najprostszym sposobem na to jest umieszczenie rownum
w instrukcji where wewnętrznego zapytania.
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