powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странный баг при left outer join (v 12.1.0.2.0)
16 сообщений из 16, страница 1 из 1
Странный баг при left outer join (v 12.1.0.2.0)
    #39318195
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДВС !

Заранее прошу не считать бредом сумасшедшего :)

ситуация:
главная таблица содержит кроме прочих полей два разных ID из одной таблицы-справочника.
полностью приводить не буду, просто для понимания:

справочник:

dct_t(
dct_id number,
dct_name varchar2(100)
)

главная:

main_t(
m_id number,
m_name varchar2(100),
dct_id_1 number,
dct_id_2 number
)

запрос типа такого:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    insert into report_table (  m_id,  m_name,  dct_id_1,  dct_id_2,  name_1 , name_2 )
    select     
              m.m_id, 
              m.m_name, 
              m.dct_id_1, 
              m.dct_id_2,   
              d1.dct_name  name_1,   
              d2.dct_name  name_2
    from
          main_t  m,
          dct_t    d1,
          dct_t    d2
   where 
                m.dct_id_1 = d1.dct_id(+)
          and m.dct_id_2 = d2.dct_id(+)
   ;



Естественно, все несколько сложнее
- полей больше и доп. условий достаточно,
- таблиц других, которые по left outer join присоединяются больше(но они дважды не используются при присоединении)

Чаще всего запрос срабатывает правильно :)
Однако, иногда значения name_1 и name_2 - строго наоборот (меняются местами !) во всем результате ... :)
Причем dct_id_1 и dct_id_2 - выдаются в требуемых позициях правильно (не удивительно - берутся из главной).

т.е. вместо name_1 name_2 я получаю в результате name_2 name_1

Первой мыслью было, что кто-то меняет справочник :) . Полный аудит любых изменений данных в справочнике показал, что никто не изменяет.

логирование самих запросов (процедура, динамический sql) доказывает, что исполняется один и тот же запрос.
дублей процедуры с другим набором параметров нет. Она одна. исполняется в JOB.

повторить неправильный результат простым многократным исполнением запроса не удается.
если запустить тот же JOB, то скорее всего будет правильный результат.

Никто с подобным не сталкивался ?
Пока отключили распараллеливание при исполнении и ждем повторения...
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318389
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65,

есть подозрение, что изобретая запрос типа такого, вы полностью замаскировали причину чудес
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318538
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orawish,
допускаю, что замаскировано ...

более подробно:

система отчетов по трафику.

отчет формируется запросом:
заданы бинд-переменные
:l_Date_From :l_Date_To
все остальные переменные = null.
При динамическом формировании запроса добавляется условие AND (PHONEA LIKE '%111111111%' ESCAPE '\')

В результате иногда меняются местами данные в полях ORIGINATOR, TERMINATOR.

т.е. в двух отчетах с одним и тем же запросом:
IDCDR (уникальный ID CDR-а) одинаковый но значения ORIGINATOR, TERMINATOR строго "наоборот" ...
при этом
запись CDR-а так же гарантированно не меняется с момента ее insert-a.
справочник DIMTRANKGROUPS так же не меняется.

Запрос из вьюхи STAT_DETAIL_V (формирование данных отчета. В обоих случаях (правильно/неправильно)текст запроса один и тот же. лог подтверждает):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
INSERT INTO STAT.RPT_R_DETAIL_CDR ( 
       REPORT_ID, ANSTIME, I_TRUNK_GROUP_IN, I_TRUNK_GROUP_OUT, CONVERSATIONTIME, IDCDR, SOFTX, GATE, 
       CALLER_CATEG, INTELLI_TYPE, 
       PH_A_NATURE, PHONEA, PH_B_NATURE, PHONEB, PHONEDIAL, 
       MGMN_SIGN, ORIGINATOR, TERMINATOR, 
       CODE_TERM_HUAWEI, NAME_TERM_HUAWEI, NAMETERMREASON, CODE_TERM_Q, NAME_TERM_Q, 
       REGION_NAME, CODEPREFIXMIN, CODEPREFIXMAX, 
       PDD, SERVICE_TYPE, ADD_SERVICE, 
       PH_ORIG_NATURE, PHONEORIG, PH_REDIR_NATURE, PHONEREDIR, PH_CONN_NATURE, CONNECTED_NUMBER) 

SELECT /*+ parallel(6) */        :p_Report_Id,         ANSTIME,                  I_TRUNK_GROUP_IN,         I_TRUNK_GROUP_OUT,        CONVERSATIONTIME,         IDCDR,                    SOFTX,                    GATE,                     CALLER_CATEG,             INTELLI_TYPE,             PH_A_NATURE,              PHONEA,                   PH_B_NATURE,              PHONEB,                   PHONEDIAL,                MGMN_SIGN,                ORIGINATOR,               TERMINATOR,               CODE_TERM_HUAWEI,         NAME_TERM_HUAWEI,         NAMETERMREASON,           CODE_TERM_Q,              NAME_TERM_Q,              REGION_NAME,              CODEPREFIXMIN,            CODEPREFIXMAX,            PDD,                      SERVICE_TYPE,             ADD_SERVICE,              PH_ORIG_NATURE,           PHONEORIG,                PH_REDIR_NATURE,          PHONEREDIR,               PH_CONN_NATURE,           CONNECTED_NUMBER  
 FROM STAT_DETAIL_V v 
WHERE v.anstime BETWEEN :l_Date_From AND :l_Date_To 
  AND (v.conversationtime >= :l_Dur_Min OR :l_Dur_Min IS NULL) 
  AND (v.conversationtime <= :l_Dur_Max OR :l_Dur_Max IS NULL) 
  AND (v.pdd >= :l_PDD_Min OR :l_PDD_Min IS NULL) 
  AND (v.pdd <= :l_PDD_Max OR :l_PDD_Max IS NULL)
  AND (v.idnumbernaturea <= :l_Norm_A  OR :l_Norm_A IS NULL)
  AND (v.idnumbernatureb <= :l_Norm_B  OR :l_Norm_B IS NULL)
  AND (v.idnumbernatureorig <= :l_Norm_Orig  OR :l_Norm_Orig IS NULL)
  AND (v.idnumbernatureredir <= :l_Norm_Redir  OR :l_Norm_Redir IS NULL)
  AND (v.idnumbernatureconnected <= :l_Norm_Conn  OR :l_Norm_Conn IS NULL)
 AND (PHONEA LIKE '%111111111%' ESCAPE '\')




сама вьюха STAT_DETAIL_V:
Код: 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.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
CREATE OR REPLACE FORCE VIEW STAT_DETAIL_V
(
   IDCDR,
   IDSWITCH,
   SOFTX,
   GATE,
   CALLER_CATEG,
   INTELLI_TYPE,
   ANSTIME,
   PH_A_NATURE,
   PHONEA,
   PH_B_NATURE,
   PHONEB,
   PHONEDIAL,
   MGMN_SIGN,
   CONVERSATIONTIME,
   ORIGINATOR,
   TERMINATOR,
   CODE_TERM_HUAWEI,
   NAME_TERM_HUAWEI,
   NAMETERMREASON,
   CODE_TERM_Q,
   NAME_TERM_Q,
   REGION_NAME,
   CODEPREFIXMIN,
   CODEPREFIXMAX,
   PDD,
   I_TRUNK_GROUP_IN,
   I_TRUNK_GROUP_OUT,
   SERVICE_TYPE,
   ADD_SERVICE,
   PH_ORIG_NATURE,
   PHONEORIG,
   PH_REDIR_NATURE,
   PHONEREDIR,
   PH_CONN_NATURE,
   CONNECTED_NUMBER,
   IDCALLERCATEGORY,
   IDTGA,
   IDTGB,
   IDTERM,
   IDTERMREASON,
   IDBEARERSERVICE,
   IDSUPSERVTYPE,
   IDNUMBERNATUREA,
   IDNUMBERNATUREB,
   IDNUMBERNATUREORIG,
   IDNUMBERNATUREREDIR,
   IDNUMBERNATURECONNECTED,
   IDDIRECTION,
   IDGATE
)
AS
   SELECT f.idcdr,
          f.idswitch,
          TO_CHAR (ds.codeswitch) || ' ' || ds.nameswitch SoftX,
          TO_CHAR (dsg.codeswitch) || ' ' || dsg.nameswitch Gate,
          dc.namecallercategory Caller_Categ,
          dis.nameiservice Intelli_Type,  
          f.anstime,
          f.ph_a_nature,
          f.phonea,
          f.ph_b_nature,
          f.phoneb,
          f.phonedial,
          f.isintername mgmn_sign,
          conversationtime,
          dtga.nametg originator,
          dtgb.nametg terminator,
          dth.codetermh code_term_huawei,
          dth.nametermh name_term_huawei,
          dr.nametermreason,
          dth.codetermq code_term_q,
          dth.nametermq name_term_q,
          NVL (NVL (dd.namedirection, dd.namezone), dd.namecountry) region_name,
          dd.codeprefixmin,
          dd.codeprefixmax,
          f.pdd,
          f.i_trunk_group_in,
          f.i_trunk_group_out,
          db.namebearerservice service_type,  
          dsp.namesupservicetype Add_Service,     
          f.ph_orig_nature,
          f.phoneorig,    
          f.ph_redir_nature,
          f.phoneredir,   
          f.ph_conn_nature,
          f.connected_number,  
          f.idcallercategory,
          f.idtga,
          f.idtgb,
          f.idterm,
          f.idtermreason,
          f.idbearerservice,
          F.idsupservtype,
          f.idnumbernaturea,
          f.idnumbernatureb,
          f.idnumbernatureorig,
          f.idnumbernatureredir,
          f.idnumbernatureconnected,
          f.iddirection,
          f.idgate
     FROM 
          fact_cdr f,
          DIMSWITCHES ds,
          DIMSWITCHES dsg,
          DIMCALLERCATEGORIES dc,
          DIMISERVICES dis,
          DIMSUPSERVICETYPES dsp,
          DIMTRANKGROUPS dtga,
          DIMTRANKGROUPS dtgb,
          DIMTERMINATIONCODES dth,
          DIMTERMINATIONREASONS dr,
          DIMDIRECTIONS dd,
          DIMBEARERSERVICES db
    WHERE     
                 f.idswitch = ds.idswitch(+)
          AND f.idgate = dsg.idswitch(+)
          AND f.idcallercategory = dc.idcallercategory(+)
          AND f.idiservice = dis.idiservice(+)
          AND F.IDSUPSERVTYPE = dsp.IDSUPSERVICETYPE(+)
          AND f.idtga = dtga.idtg(+)
          AND f.idtgb = dtgb.idtg(+)
          AND f.idterm = dth.idterm(+)
          AND f.idtermreason = dr.idtermreason(+)
          AND f.iddirection = dd.iddirection(+)
          AND f.idbearerservice = db.idbearerservice(+)
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318577
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В догонку

вчера еще изменили: _rowsets_enable=false
был true.

пока ждем повторения.
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318580
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65
Код: plsql
1.
SELECT /*+ parallel(6) */


Сталкивались, 12.1.0.2, но немножко в другом контексте - integrated replicat голденгейтовый в режиме insertallrecords иногда путается в полях.
Полагал, что проблема в репликате.
В нашем случае нашли паллиатив - установка параметра, запрещающего репликату пакетные операции.
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318584
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из биндов к запросу еще задан, естественно :p_Report_Id
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318606
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

никаких репликаций нет.
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318624
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65никаких репликаций нет.
Я ж говорю - у нас другой контекст.
Но похожее поведение - путались (или смещались) поля, причем очень изредка, запрет пакетных операций помог - уже пару месяцев не стреляет.
Увидел у Вас ins-sel parallel с идентичными симптомами - решил, что, похоже, дело не в GG.
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318633
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Я выше писал, что так же выключили /*+ parallel(6) */ и ждем повторения.

Как у Вас был установлен _rowsets_enable до исчезновения проблемы и после ?
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318642
GGовец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
offtopic:
andrey_anonymous,
авторВ нашем случае нашли паллиатив - установка параметра, запрещающего репликату пакетные операции.
Параметр не подскажете?
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318677
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65В догонку

вчера еще изменили: _rowsets_enable=false
был true.

пока ждем повторения.

вполне вероятно - "правильное решение".
неправильный результат на left join - похоже на баг Bug 20960570
советуют отключать hash join или задирать arraysize до самого Марса
Но ваш вариант действий больше других похож на правильный - выключить нежданную красоту.


https://blogs.oracle.com/UPGRADE/entry/switch_off_rowsets_enabled_in
https://blogs.oracle.com/UPGRADE/entry/update_for_switch_off_rowsets
https://jonathanlewis.wordpress.com/2015/11/09/wrong-results/
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318680
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65Чаще всего запрос срабатывает правильно :)
Однако, иногда значения name_1 и name_2 - строго наоборот (меняются местами !) во всем результате ... :)У меня был еще более дикий случай - значение строкового поля обрезалось для определенной колонки и некоторого подмножества строк.

Предусловия были следующие
Код: plaintext
1.
2.
Parallel execution
Data must be not in the buffer cache. So without cleaning up the cache it’s not reproduced.

Помогло
Код: plaintext
execute immediate 'alter session set optimizer_features_enable =''10.2.0.4''';

Также не воспроизводилось если убрать из запроса все бинды.
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318681
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor-65В догонку

вчера еще изменили: _rowsets_enable=false
был true.

пока ждем повторения.Чтоб повторить делайте
Код: plaintext
alter session set events 'immediate trace name flush_cache';
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318684
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

тут еще пишут по поводу доступных патчсетов
https://blogs.oracle.com/UPGRADE/entry/update_for_switch_off_rowsets
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318702
Igor-65
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopЧтоб повторить делайте
Код: plaintext
alter session set events 'immediate trace name flush_cache';


Спасибо, я не хочу повторения :). (если я правильно понял совет... :) )
Если повторений в течении недели не будет, то считаем, что пока вылечили.
Ранее хотя бы 1 раз в 3 дня происходило стабильно...
...
Рейтинг: 0 / 0
Странный баг при left outer join (v 12.1.0.2.0)
    #39318764
GGовецПараметр не подскажете?
Код: plaintext
1.
DBOPTIONS INTEGRATEDPARAMS (..., _array_operation N)
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Странный баг при left outer join (v 12.1.0.2.0)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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