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

Откуда:
Сообщений: 11
Создаю простую таблицу с индексом и ограничением на поле code.
create table TABLE_TEST( code not null, id ) as select 'CODE_' || rownum, rownum num from dual connect by rownum < 100000;
create unique index INDEX_TEST_CODE on TABLE_TEST(code);
alter table TABLE_TEST add constraint CHECK_CODE check ( upper(code)=code );

Хочу попробовать, будет ли оптимизатор использовать функциональный индекс при
SELECT * FROM TABLE_TEST WHERE UPPER(CODE) = 'CODE_5';

Естественно будет, в 10053 видно, что
FPD: Considering simple filter push in query block SEL$1 (#0)
UPPER("TABLE_TEST"."CODE")='CODE_5'
try to generate transitive predicate from check constraints for query block SEL$1 (#0)
constraint: UPPER("TABLE_TEST"."CODE")="TABLE_TEST"."CODE"
finally: UPPER("TABLE_TEST"."CODE")='CODE_5' AND "TABLE_TEST"."CODE"='CODE_5'


Но, при использовании bind дополнительный предикат не создается
SELECT * FROM TABLE_TEST WHERE UPPER(CODE) = :1;

В 10053 все по прежнему, oracle находит соответствие UPPER("TABLE_TEST"."CODE")="TABLE_TEST"."CODE", но в результат просто не добавляет предикат
FPD: Considering simple filter push in query block SEL$1 (#0)
UPPER("TABLE_TEST"."CODE")=:B1
try to generate transitive predicate from check constraints for query block SEL$1 (#0)
constraint: UPPER("TABLE_TEST"."CODE")="TABLE_TEST"."CODE"
finally: UPPER("TABLE_TEST"."CODE")=:B1

Не могу понять, почему. Может кто подскажет, куда можно посмотреть?
10 фев 16, 09:25    [18797443]     Ответить | Цитировать Сообщить модератору
 Re: трансформация запроса  [new]
dba123
Member

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

-- а так ?
create unique index INDEX_TEST_CODE on TABLE_TEST(upper(code));
10 фев 16, 15:53    [18799819]     Ответить | Цитировать Сообщить модератору
 Re: трансформация запроса  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
index3654,

Помню такое, даже на тут форуме проскакивало, но найти сейчас не получается... зарегистрируйте SR
Кстати, если вручную предикат из check constraint добавить, то нормально трансформируется.

index3654
Хочу попробовать, будет ли оптимизатор использовать функциональный индекс при
индекс обычный
10 фев 16, 20:27    [18801473]     Ответить | Цитировать Сообщить модератору
 Re: трансформация запроса  [new]
DenFrost
Member

Откуда:
Сообщений: 9
Добрый день.Помогите правильно выполнить запрос. При выполнении запроса ругается Ora-00904 : "c"."id" инвалид идентификатор.
Как-то Join надо выполнить, что c.id определилась в подзапросе?
 select sum(length(short_name||','))
     from 
        (select distinct cdr.short_name from client cdr where cdr.service_group = 'D' and cdr.aw = c.id)
from bi, client c, acnt_contract clac, acnt_contract cac
where bi.target_contract = cac.id and cac.acnt_contract__oid = clac.id and clac.client__id = c.id 
17 фев 16, 16:20    [18830662]     Ответить | Цитировать Сообщить модератору
 Re: трансформация запроса  [new]
Egoр
Member

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

что-то как-то не понятно откуда селектим и что в итоге хотим получить :))
в одном селекте может быть только одна чаcть from, а у вас их две.
17 фев 16, 16:27    [18830731]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить