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

Откуда:
Сообщений: 113
Здравствуйте
Установил Oracle 11.2.0.3 Windows 2008 R2 x64 и столкнулся со следующей проблемой

Есть 2 таблицы
CREATE TABLE BKL_KLI1
(
  ID_KLI  VARCHAR2(16 BYTE)
);
Insert into BKL_KLI1 (ID_KLI) Values  ('AA_1');
Insert into BKL_KLI1 (ID_KLI) Values  ('AA_2');
Insert into BKL_KLI1 (ID_KLI) Values  ('AA_3');

CREATE TABLE KLI_PRM1
(
  ID_KLI   VARCHAR2(16 BYTE),
  PRM_BUH  NUMBER(3),
  PRM_MEN  NUMBER(3)
);
Insert into KLI_PRM1 (ID_KLI, PRM_BUH, PRM_MEN) Values ('AA_1', 27, 1);
Insert into KLI_PRM1 (ID_KLI, PRM_BUH, PRM_MEN) Values ('AA_2', 25, 1);
Insert into KLI_PRM1 (ID_KLI, PRM_BUH, PRM_MEN) Values ('AA_3', 27, 1);

при выполнении запроса
select *
 from bkl_kli1 kb
where 
      exists(select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_men in (
                     select 27 from dual
                     union all 
                     select 27 from dual) 
            )
or
     exists(select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_buh in (
                     select 27 from dual
                     union all 
                     select 27 from dual) 
            ) 

не возвращается ни одна строка
но если or поменять местами то результат правильный
select *
 from bkl_kli1 kb
where 
    exists(select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_buh in (
                     select 27 from dual
                     union all 
                     select 27 from dual) 
            ) 
or
      exists(select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_men in (
                     select 27 from dual
                     union all 
                     select 27 from dual) 
            )


И еще если в подзапросе in убрать union all то правильно работают оба варианта. При наличии union all в плане запроса отсутствует 2 exists

Кто то сталкивался с подобной проблемой? Как ее решить? Нехорошо получается ошибок нет и результат неправильный

В настоящем запросе конечно используется не такая конструкция
select 27 from dual
 union all 
select 27 from dual
а union all из двух разных таблиц. Здесь привел такой пример для простоты понимания

Спасибо
9 апр 12, 13:18    [12387196]     Ответить | Цитировать Сообщить модератору
 Re: 11.2.0.3 неправильно отрабатывает запрос  [new]
Timur Akhmadeev
Member

Откуда:
Сообщений: 509
Бага. Оптимизатор пытается преобразовать запрос и делает это неправильно. В качестве workaround-a можно отключить на уровне запроса/сессии:
SQL> select /*+ opt_param('_optimizer_coalesce_subqueries' 'false') */ *
  2   from bkl_kli1 kb
  3  where
  4        exists(select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_men in (
  5                       select 27 from dual
  6                       union all
  7                       select 27 from dual)
  8              )
  9  or
 10       exists(select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_buh in (
 11                       select 27 from dual
 12                       union all
 13                       select 27 from dual)
 14              )
 15  /

ID_KLI
----------------
AA_1
AA_3
AA_1
AA_3
9 апр 12, 13:35    [12387319]     Ответить | Цитировать Сообщить модератору
 Re: 11.2.0.3 неправильно отрабатывает запрос  [new]
V.C.G.
Member

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

Действительно странное поведение -- похоже, Оракл реагирует только на первый exists в запросе (пока не нашел тому подтверждения в документации). Но вот в таком виде это можно обойти:

select *
 from bkl_kli1 kb
where 
     exists(select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_men in (
                     select 27 from dual
                     union all 
                     select 27 from dual) 
			union
			select * from kli_prm1 k where k.id_kli=kb.id_kli and k.prm_buh in (
                     select 27 from dual
                     union all 
                     select 27 from dual) 
            );
9 апр 12, 13:57    [12387482]     Ответить | Цитировать Сообщить модератору
 Re: 11.2.0.3 неправильно отрабатывает запрос  [new]
SergeyNZ
Member

Откуда:
Сообщений: 113
Спасибо за ответы
но я наверное отключу эту особенность до лучших времен
alter system set "_optimizer_coalesce_subqueries" = false scope=both

т.к. если эта ошибка вылезет еще в каких то запросах и ее заметят очень поздно то это не очень хорошо
9 апр 12, 14:19    [12387614]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить