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

Откуда:
Сообщений: 23
Добрый вечер.

Есть запрос вида:
select col1, col2, fnc(col1), fnc(col2) from tab1 where col3=4
По tab1 как и положено Full scan. Время выполнение, 30msec. Число записей в tab1 - 400 строк. Запрос возвращает 18 записей.
Запрос в конечном виде должен выглядеть так:
select col1, col2, fnc(col1), fnc(col2) from tab1 where col3=4 and (fnc(col1) = 'A' or fnc(col2) = 'B')
Теперь имеем время выполнение ~3sec. То есть, оптимизатор пытается применить предикат fnc(col1) = 'A' по всей таблице, функция малость тяжела, поэтому и получаем тормоза.

Не подскажете как заставить выполнить сначала col3=4, а потом все остальное.

PS. Пробовал обернуть в подзапрос, та же шляпа, затаскивает предикаты внутрь запроса.
22 июн 09, 23:45    [7330966]     Ответить | Цитировать Сообщить модератору
 Re: Выполнитьсначала подзапрос в запросе  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Vasily_s,

А так:

select col1, col2, f1, f2 
  from (select col1, col2, fnc(col1) f1, fnc(col2) f2, rownum rn from tab1 where col3=4)
 where (f1 = 'A' or f2 = 'B')
23 июн 09, 00:39    [7331036]     Ответить | Цитировать Сообщить модератору
 Re: Выполнитьсначала подзапрос в запросе  [new]
Vasily_s
Member

Откуда:
Сообщений: 23
suPPLer,

Спасибо огромное, то что нужно! rownum спас ситуацию.
23 июн 09, 09:25    [7331387]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить