Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / неправильный результат при использовании групповой функции / 8 сообщений из 8, страница 1 из 1
09.06.2021, 15:08
    #40076644
Eugene12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
простой запрос на 2 таблицы выдает неправильный результат после перехода с 12 на 19 версию
не могу найти номер бага или ноты, может не по тем словам ищу

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
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"(+))
...
Рейтинг: 0 / 0
09.06.2021, 15:37
    #40076652
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
Eugene12
Код: plsql
1.
2.
3.
4.
--правильный результат
MIN(T1.NUM) MIN(T2.NUM) MIN(T3.STR)                             
----------- ----------- ----------------------------------------
          0    


Почему это правильный результат, если
Код: plsql
1.
2.
3.
4.
5.
6.
SQL> set null *null*
SQL> select * from tbl_1 t1 where id=50;

        ID      PARID        NUM
---------- ---------- ----------
        50         53 *null*
...
Рейтинг: 0 / 0
09.06.2021, 16:20
    #40076670
Maksim Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
Ну. Если вы уверены в том что это: действительно wrong result, и оно у вас - после апгрейда, и до апгрейда оно у вас - работало корректно, то вам, почти наверняка, сюда .
...
Рейтинг: 0 / 0
09.06.2021, 18:06
    #40076707
Eugene12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
Sayan Malakshinov,

да, мой косяк, старую версию вставил
вот так правильно
Код: plsql
1.
2.
3.
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;
...
Рейтинг: 0 / 0
09.06.2021, 18:09
    #40076709
Eugene12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
Пока что нашел это
авторRediscovery Notes
Incorrect generation of 'IS NOT NULL' predicates produce wrong results.
.
Workaround
"_fix_control"='24761824:OFF'
...
Рейтинг: 0 / 0
09.06.2021, 23:09
    #40076765
Sayan Malakshinov
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
Eugene12
Пока что нашел это
авторRediscovery Notes
Incorrect generation of 'IS NOT NULL' predicates produce wrong results.
.
Workaround
"_fix_control"='24761824:OFF'

да все верно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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.
...
Рейтинг: 0 / 0
10.06.2021, 07:47
    #40076778
Maksim Ivanov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
Хорошо что нашлось. Нота, про этот баг, на металинке
Код: plaintext
Doc ID 29661065.8
...
Рейтинг: 0 / 0
10.06.2021, 13:07
    #40076865
Eugene12
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неправильный результат при использовании групповой функции
Очень жаль, что простые запросы по простым таблицам перестают работать корректно
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / неправильный результат при использовании групповой функции / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]