Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 2 Вопроса  [new]
Ora-00001
Guest
Привет

1. Для того, чтобы не deterministic функция вызывалась 1 раз за весь запрос делаю так:
... and (select f from dual) = 1
Эффект достигнут. Но при всенх ли условиях функция будет вызываться не более 1 раза за запрос?

1. Есть условие вида
f = 1 or ...
f - функция. Есть ли возможность дать оптимизатору указание, что надо вычислять значение f в первую очередь, а только потом проверять остальные условия?
23 мар 08, 18:03    [5447411]     Ответить | Цитировать Сообщить модератору
 Re: 2 Вопроса  [new]
javajdbc
Member

Откуда: Montreal
Сообщений: 17715
Используя WITH and MATERIALIZE можно
убить любую возможность SQL-rewrite и
контроилировать порядок выполнения.

(имеется ввиду F не зависит от строки? так?)

with a as
(select /*+ MATERIALIZE */ f f_val from dual)
select * from t, a
where a.f_val = 1 and .....

Для условия *....F=1 OR...*
тоже может подойти With/materialize трюк.
Идея в том чтоб вынести проверки в
разные селекты и материализовывать их
в явном виде (/*+MATERIALIZE*/), чтоб не было sql-rewrite.

(Вместо хинта, который был недокументирован,
можно использовать rownum < 1000000000 или
что нибуть типа етого, что вызывает материализацию селекта)
23 мар 08, 19:13    [5447541]     Ответить | Цитировать Сообщить модератору
 Re: 2 Вопроса  [new]
Ora-00001
Guest
javajdbc

имеется ввиду F не зависит от строки? так?

Да

javajdbc

Для условия *....F=1 OR...*
тоже может подойти With/materialize трюк.
Идея в том чтоб вынести проверки в
разные селекты и материализовывать их
в явном виде (/*+MATERIALIZE*/), чтоб не было sql-rewrite.

Хм, а разве есть гарантия, что первым будет подчситываться селект с функцией и при этом пропускаться второй селект если F=1?
23 мар 08, 20:32    [5447706]     Ответить | Цитировать Сообщить модератору
 Re: 2 Вопроса  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
В принципе есть хинт ORDERED_PREDICATES, но его деприкейтнули.
23 мар 08, 21:03    [5447764]     Ответить | Цитировать Сообщить модератору
 Re: 2 Вопроса  [new]
javajdbc
Member

Откуда: Montreal
Сообщений: 17715
WIth/materialize ето способ гарантировано делать
вычисления F один раз _перед_ основным селектом.

Дальше можно использовать and, or или все что угодно
для контроля следуюшего селекта.
23 мар 08, 21:13    [5447783]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить