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

Откуда:
Сообщений: 71
простой запрос на 2 таблицы выдает неправильный результат после перехода с 12 на 19 версию
не могу найти номер бага или ноты, может не по тем словам ищу

create table tbl_1 (
id number not null primary key,
parid number,
num number);

create table tbl_3 (
id number not null primary key,
str varchar2(40));

insert into tbl_1 
select level, decode(mod(level, 2), 0, level+3), decode(mod(level, 7), 0, mod(level, 10)) from dual
connect by level <= 1000;

insert into tbl_3 
select level, 'aaa'||level from dual
connect by level <= 1000;

commit;

select min(t1.num), min(t2.num), min(t3.str)
from tbl_1 t1, tbl_1 t2, tbl_3 t3
where t1.ID = 50
and t2.ID = t3.ID(+)
and t1.ID = t2.parID(+)
--правильный результат
MIN(T1.NUM) MIN(T2.NUM) MIN(T3.STR)                             
----------- ----------- ----------------------------------------
          0                                                     
1 row selected.
Plan hash value: 3460543843
 
-----------------------------------------------------------------------------------------------
| Id  | Operation                      | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |              |     1 |   100 |     5   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE                |              |     1 |   100 |            |          |
|   2 |   NESTED LOOPS OUTER           |              |     1 |   100 |     5   (0)| 00:00:01 |
|   3 |    NESTED LOOPS OUTER          |              |     1 |    65 |     4   (0)| 00:00:01 |
|   4 |     TABLE ACCESS BY INDEX ROWID| TBL_1        |     1 |    26 |     1   (0)| 00:00:01 |
|*  5 |      INDEX UNIQUE SCAN         | SYS_C0064651 |     1 |       |     1   (0)| 00:00:01 |
|*  6 |     TABLE ACCESS FULL          | TBL_1        |     1 |    39 |     3   (0)| 00:00:01 |
|   7 |    TABLE ACCESS BY INDEX ROWID | TBL_3        |     1 |    35 |     1   (0)| 00:00:01 |
|*  8 |     INDEX UNIQUE SCAN          | SYS_C0064653 |     1 |       |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   5 - access("T1"."ID"=50)
   6 - filter("T2"."PARID"(+)=50)
   8 - access("T2"."ID"="T3"."ID"(+))
 
Note
-----
   - dynamic statistics used: dynamic sampling (level=2)


begin
DBMS_STATS.GATHER_TABLE_STATS (ownname=> user, tabname => 'tbl_1', estimate_percent => 30);
DBMS_STATS.GATHER_TABLE_STATS (ownname=> user, tabname => 'tbl_3', estimate_percent => 30);
end;

select min(t1.num), min(t2.num), min(t3.str)
from tbl_1 t1, tbl_1 t2, tbl_3 t3
where t1.ID = 50
and t2.ID = t3.ID(+)
and t1.ID = t2.parID(+)


-- неправильный результат
MIN(T1.NUM) MIN(T2.NUM) MIN(T3.STR)                             
----------- ----------- ----------------------------------------
                                                                
1 row selected.

Plan hash value: 2490648173
 
------------------------------------------------------------------------------------------------
| Id  | Operation                       | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |              |     1 |    24 |     6   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE                 |              |     1 |    24 |            |          |
|*  2 |   FILTER                        |              |       |       |            |          |
|   3 |    NESTED LOOPS OUTER           |              |     1 |    24 |     6   (0)| 00:00:01 |
|   4 |     NESTED LOOPS OUTER          |              |     1 |    13 |     5   (0)| 00:00:01 |
|   5 |      TABLE ACCESS BY INDEX ROWID| TBL_1        |     1 |     6 |     2   (0)| 00:00:01 |
|*  6 |       INDEX UNIQUE SCAN         | SYS_C0064639 |     1 |       |     1   (0)| 00:00:01 |
|*  7 |      TABLE ACCESS FULL          | TBL_1        |     1 |     7 |     3   (0)| 00:00:01 |
|   8 |     TABLE ACCESS BY INDEX ROWID | TBL_3        |     1 |    11 |     1   (0)| 00:00:01 |
|*  9 |      INDEX UNIQUE SCAN          | SYS_C0064641 |     1 |       |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - filter("T3"."STR" IS NOT NULL OR "T2"."NUM" IS NOT NULL)
   6 - access("T1"."ID"=50)
   7 - filter("T2"."PARID"(+)=50)
   9 - access("T2"."ID"="T3"."ID"(+))
9 июн 21, 15:08    [22333346]     Ответить | Цитировать Сообщить модератору
 Re: неправильный результат при использовании групповой функции  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5888
Eugene12
--правильный результат
MIN(T1.NUM) MIN(T2.NUM) MIN(T3.STR)                             
----------- ----------- ----------------------------------------
          0    

Почему это правильный результат, если
SQL> set null *null*
SQL> select * from tbl_1 t1 where id=50;

        ID      PARID        NUM
---------- ---------- ----------
        50         53 *null*
9 июн 21, 15:37    [22333361]     Ответить | Цитировать Сообщить модератору
 Re: неправильный результат при использовании групповой функции  [new]
Maksim Ivanov
Member

Откуда:
Сообщений: 14
Ну. Если вы уверены в том что это: действительно wrong result, и оно у вас - после апгрейда, и до апгрейда оно у вас - работало корректно, то вам, почти наверняка, сюда.
9 июн 21, 16:20    [22333398]     Ответить | Цитировать Сообщить модератору
 Re: неправильный результат при использовании групповой функции  [new]
Eugene12
Member

Откуда:
Сообщений: 71
Sayan Malakshinov,

да, мой косяк, старую версию вставил
вот так правильно
insert into tbl_1 
select level, decode(mod(level, 2), 0, level+3), decode(mod(level, 5), 0, mod(level, 10)) from dual
connect by level <= 1000;
9 июн 21, 18:06    [22333468]     Ответить | Цитировать Сообщить модератору
 Re: неправильный результат при использовании групповой функции  [new]
Eugene12
Member

Откуда:
Сообщений: 71
Пока что нашел это
автор
Rediscovery Notes
Incorrect generation of 'IS NOT NULL' predicates produce wrong results.
.
Workaround
"_fix_control"='24761824:OFF'
9 июн 21, 18:09    [22333471]     Ответить | Цитировать Сообщить модератору
 Re: неправильный результат при использовании групповой функции  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5888
Eugene12
Пока что нашел это
автор
Rediscovery Notes
Incorrect generation of 'IS NOT NULL' predicates produce wrong results.
.
Workaround
"_fix_control"='24761824:OFF'

да все верно:
SQL> select
  2   min(t1.num), min(t2.num), min(t3.str)
  3  from tbl_1 t1, tbl_1 t2, tbl_3 t3
  4  where t1.ID = 50
  5  and t2.ID = t3.ID(+)
  6  and t1.ID = t2.parID(+);

MIN(T1.NUM) MIN(T2.NUM) MIN(T3.STR)
----------- ----------- ----------------------------------------
*null*      *null*      *null*

1 row selected.

SQL> select--+ opt_param('_fix_control' '24761824:OFF')
  2   min(t1.num), min(t2.num), min(t3.str)
  3  from tbl_1 t1, tbl_1 t2, tbl_3 t3
  4  where t1.ID = 50
  5  and t2.ID = t3.ID(+)
  6  and t1.ID = t2.parID(+);

MIN(T1.NUM) MIN(T2.NUM) MIN(T3.STR)
----------- ----------- ----------------------------------------
          0 *null*      *null*

1 row selected.
9 июн 21, 23:09    [22333553]     Ответить | Цитировать Сообщить модератору
 Re: неправильный результат при использовании групповой функции  [new]
Maksim Ivanov
Member

Откуда:
Сообщений: 14
Хорошо что нашлось. Нота, про этот баг, на металинке
Doc ID 29661065.8
10 июн 21, 07:47    [22333570]     Ответить | Цитировать Сообщить модератору
 Re: неправильный результат при использовании групповой функции  [new]
Eugene12
Member

Откуда:
Сообщений: 71
Очень жаль, что простые запросы по простым таблицам перестают работать корректно
10 июн 21, 13:07    [22333741]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить