powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / неправильный результат при использовании групповой функции
8 сообщений из 8, страница 1 из 1
неправильный результат при использовании групповой функции
    #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
неправильный результат при использовании групповой функции
    #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
неправильный результат при использовании групповой функции
    #40076670
Maksim Ivanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну. Если вы уверены в том что это: действительно wrong result, и оно у вас - после апгрейда, и до апгрейда оно у вас - работало корректно, то вам, почти наверняка, сюда .
...
Рейтинг: 0 / 0
неправильный результат при использовании групповой функции
    #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
неправильный результат при использовании групповой функции
    #40076709
Eugene12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока что нашел это
авторRediscovery Notes
Incorrect generation of 'IS NOT NULL' predicates produce wrong results.
.
Workaround
"_fix_control"='24761824:OFF'
...
Рейтинг: 0 / 0
неправильный результат при использовании групповой функции
    #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
неправильный результат при использовании групповой функции
    #40076778
Maksim Ivanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо что нашлось. Нота, про этот баг, на металинке
Код: plaintext
Doc ID 29661065.8
...
Рейтинг: 0 / 0
неправильный результат при использовании групповой функции
    #40076865
Eugene12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень жаль, что простые запросы по простым таблицам перестают работать корректно
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / неправильный результат при использовании групповой функции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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