Редът, по който Oracle оценява условията, намерени в клаузата where, не е фиксиран. Това означава, че може да избере да оцени условието, съдържащо TO_DATE, преди другите критерии, в който случай заявката ще бъде неуспешна. За да предотвратите това, добавете подсказката за ordered_predicates към вашата заявка, но имайте предвид, че това може да изисква допълнителна ръчна настройка за подобряване на производителността.
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
Очевидно ordered_predicates
се отхвърля, започвайки с 10g. В такъв случай мисля, че единствената ви възможност е да използвате подзаявка по такъв начин, че оптимизаторът да е принуден първо да я оцени (т.е. да не може да комбинира заявките). Най-лесният начин да направите това е да поставите rownum
в командата where на вътрешната заявка.
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