powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
25 сообщений из 25, страница 1 из 1
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251054
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
Код: plsql
1.
select * from v$version;


Код: html
1.
2.
3.
4.
5.
6.
7.
BANNER

Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production 
PL/SQL Release 9.2.0.8.0 - Production 
CORE 9.2.0.8.0 Production 
TNS for IBM/AIX RISC System/6000: Version 9.2.0.8.0 - Production 
NLSRTL Version 9.2.0.8.0 - Production 


Код: plsql
1.
CREATE OR REPLACE TYPE TPS_TABLETYPE_VARCHAR AS VARRAY(1000) OF VARCHAR2(100);


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION F_STR_TO_TBLV
(PV_STR in VARCHAR2
)
RETURN tps_tabletype_varchar
IS
  lv_str long default pv_str||',';
  ln_n number;
  lt_data TPS_TABLETYPE_VARCHAR := TPS_TABLETYPE_VARCHAR();
begin
  loop
    ln_n := instr(lv_str,',');
    exit when (nvl(ln_n,0) = 0 );
    lt_data.extend;
    lt_data(lt_data.count) := ltrim (rtrim(substr(lv_str,1,ln_n - 1)));
    lv_str := substr(lv_str, ln_n + 1);
  end loop;
  return lt_data;
end f_str_to_tblv;


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t 
where case :lv_v1 when '0' then '0' else to_char(id) end 
  in (
      select t1.column_value  from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar)) t1
      );


При передачи параметра :lv_v1 = '0' - получаем результат как и планировалось 4 строки.
На 12 версии - 0 строк при том же значении параметра.
Код: html
1.
2.
3.
4.
5.
6.
7.
BANNER

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production 
PL/SQL Release 12.1.0.2.0 - Production 
CORE 12.1.0.2.0 Production 
TNS for Linux: Version 12.1.0.2.0 - Production 
NLSRTL Version 12.1.0.2.0 - Production 


Если же передавать два параметра - оба с значением '0', то результат так же становится - 4 строки.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t 
where case :lv_v1 when '0' then '0' else to_char(id) end 
  in (
      select t1.column_value  from table (cast(f_str_to_tblv(:lv_v2) as tps_tabletype_varchar)) t1
      );


При использовании в PLSQL такой проблемы не наблюдается.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare
  lv_v1 varchar2(100) := '0';
  ln_n1 number;
begin  
  with t as (
    select 1 id, 'name1' name from dual union all
    select 2 id, 'name2' name from dual union all
    select 3 id, 'name3' name from dual union all
    select 4 id, 'name4' name from dual 
    )
  select count(*)
  into ln_n1
  from t 
  where case lv_v1 when '0' then '0' else to_char(id) end 
    in (
        select t1.column_value  from table (cast(f_str_to_tblv(lv_v1) as tps_tabletype_varchar)) t1
        );
  DBMS_OUTPUT.PUT_LINE ( 'ln_n1 = ' || ln_n1 );
end;        


Код: html
1.
ln_n1 = 4


Прошу помощи.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251128
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umalovпри подготовки
При передачи параметра
При использовании в PLSQLНепоследовательное изложение. Либо ошибаться надо во всех окончаниях, либо при сравнении вариантов соотносить с инвариантной категорией. Передача параметров не противоречит использованию в plsql.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251186
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

За плохое знание родного русского языка прошу прощения.
Не могу понять, почему если в запросе использовать две переменные : lv_v1 и : lv_v2, то работает. Если только одну – не работает.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t 
where case :lv_v1 when '0' then '0' else to_char(id) end 
  in (
      select t1.column_value  from table (cast(f_str_to_tblv(:lv_v2) as tps_tabletype_varchar)) t1
      );
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251235
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umalovЕсли только одну – не работает.Клиент разучился биндить одноименные параметры. Включи трассировку с биндами и посмотри фактические значения.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251379
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,
Да, вы правы.
Bind#1
No oacdef for this bind.

Код: html
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.
=====================
PARSING IN CURSOR #140437594276064 len=412 dep=0 uid=12962 oct=3 lid=12962 tim=1273562577755 hv=2703916879 ad='37bdd1b00' sqlid='839kdt6hknzug'
with t as (
    select 1 id, 'name1' name from dual union all
    select 2 id, 'name2' name from dual union all
    select 3 id, 'name3' name from dual union all
    select 4 id, 'name4' name from dual 
  )
  select *
  
  from t tt
  where decode(:lv_v1 ,'0','0', to_char(id)) 
  in (
      select t1.column_value  from table (cast(laupadmin.f_str_to_tblv(:lv_v1) as laupadmin.tps_tabletype_varchar)) t1
      )
END OF STMT
PARSE #140437594276064:c=0,e=525,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1273562577754
...

BINDS #140437594276064:
 Bind#0
  oacdty=01 mxl=32(01) mxlc=01 mal=00 scl=00 pre=00
  oacflg=01 fl2=1000010 frm=01 csi=171 siz=32 off=0
  kxsbbbfp=7fba2c90f010  bln=32  avl=01  flg=05
  value="0"
 Bind#1
  No oacdef for this bind.
EXEC #140437594276064:c=35995,e=47682,p=1,cr=131,cu=0,mis=1,r=0,dep=0,og=1,plh=3868865355,tim=1273562625530
WAIT #140437594276064: nam='SQL*Net message to client' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1273562625588
FETCH #140437594276064:c=0,e=693,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=3868865355,tim=1273562626306
STAT #140437594276064 id=1 cnt=0 pid=0 pos=1 obj=0 op='HASH JOIN SEMI (cr=0 pr=0 pw=0 time=690 us cost=37 size=12 card=1)'
STAT #140437594276064 id=2 cnt=4 pid=1 pos=1 obj=0 op='VIEW  (cr=0 pr=0 pw=0 time=15 us cost=8 size=40 card=4)'
STAT #140437594276064 id=3 cnt=4 pid=2 pos=1 obj=0 op='UNION-ALL  (cr=0 pr=0 pw=0 time=15 us)'
STAT #140437594276064 id=4 cnt=1 pid=3 pos=1 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140437594276064 id=5 cnt=1 pid=3 pos=2 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=1 us cost=2 size=0 card=1)'
STAT #140437594276064 id=6 cnt=1 pid=3 pos=3 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140437594276064 id=7 cnt=1 pid=3 pos=4 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140437594276064 id=8 cnt=1 pid=1 pos=2 obj=0 op='COLLECTION ITERATOR PICKLER FETCH F_STR_TO_TBLV (cr=0 pr=0 pw=0 time=182 us cost=29 size=16336 card=8168)'

*** 2016-06-06 15:21:04.959
WAIT #140437594276064: nam='SQL*Net message from client' ela= 5078186 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1273567704747
XCTEND rlbk=0, rd_only=1, tim=1273567704882
WAIT #0: nam='SQL*Net message to client' ela= 2 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1273567704926
WAIT #0: nam='SQL*Net message from client' ela= 7446 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1273567712385
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251425
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umalov,

Похоже баг оператора TABLE:

Код: 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.
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE    12.1.0.2.0      Production
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production

SQL> variable lv_v1 varchar2(10)
SQL> exec :lv_v1 := '0';

PL/SQL procedure successfully completed.

SQL> with t as (
  2    select 1 id, 'name1' name from dual union all
  3    select 2 id, 'name2' name from dual union all
  4    select 3 id, 'name3' name from dual union all
  5    select 4 id, 'name4' name from dual 
  6    )
  7  select id, name
  8  from t 
  9  where case :lv_v1 when '0' then '0' else to_char(id) end 
 10    in (
 11        select t1.column_value  from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar)) t1
 12        );

no rows selected



В тоже время:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SQL> select f_str_to_tblv(:lv_v1) from dual
  2  /

F_STR_TO_TBLV(:LV_V1)
--------------------------------------------
TPS_TABLETYPE_VARCHAR('0')

SQL> 



Лечится:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> with t as (
  2    select 1 id, 'name1' name from dual union all
  3    select 2 id, 'name2' name from dual union all
  4    select 3 id, 'name3' name from dual union all
  5    select 4 id, 'name4' name from dual
  6    )
  7  select id, name
  8  from t
  9  where case :lv_v1 when '0' then '0' else to_char(id) end
 10    in (
 11        with x as (select :lv_v1 val from dual)
 12        select t1.column_value  from x,table (cast(f_str_to_tblv(val) as tps_tabletype_varchar)) t1
 13       );

        ID NAME
---------- -----
         4 name4
         3 name3
         2 name2
         1 name1

SQL> 



SY.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251634
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Проверил ваш вариант - работает - снял trace

Код: 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.
=====================
PARSING IN CURSOR #140651664107648 len=433 dep=0 uid=12962 oct=3 lid=12962 tim=1335954118822 hv=2986761633 ad='3c0961850' sqlid='57z84w2t0crd1'
with t as (
    select 1 id, 'name1' name from dual union all
    select 2 id, 'name2' name from dual union all
    select 3 id, 'name3' name from dual union all
    select 4 id, 'name4' name from dual 
  )
  select *
  from t tt
  where decode(:lv_v1 ,'0','0', to_char(id)) 
  in (
     with x as (select :lv_v1 val from dual)
      select t1.column_value  from x,table (cast(f_str_to_tblv(val) as tps_tabletype_varchar)) t1
      )
END OF STMT
PARSE #140651664107648:c=0,e=490,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1335954118821
...
BINDS #140651664107648:
 Bind#0
  oacdty=01 mxl=32(01) mxlc=01 mal=00 scl=00 pre=00
  oacflg=01 fl2=1000010 frm=01 csi=171 siz=32 off=0
  kxsbbbfp=7fec0477fc40  bln=32  avl=01  flg=05
  value="0"
 Bind#1
  No oacdef for this bind.
EXEC #140651664107648:c=4998,e=5196,p=0,cr=27,cu=0,mis=1,r=0,dep=0,og=1,plh=2808247184,tim=1335954124110
WAIT #140651664107648: nam='SQL*Net message to client' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1335954124173
FETCH #140651664107648:c=0,e=791,p=0,cr=0,cu=0,mis=0,r=4,dep=0,og=1,plh=2808247184,tim=1335954124984
STAT #140651664107648 id=1 cnt=4 pid=0 pos=1 obj=0 op='HASH JOIN SEMI (cr=0 pr=0 pw=0 time=769 us cost=39 size=62 card=1)'
STAT #140651664107648 id=2 cnt=4 pid=1 pos=1 obj=0 op='VIEW  (cr=0 pr=0 pw=0 time=15 us cost=8 size=40 card=4)'
STAT #140651664107648 id=3 cnt=4 pid=2 pos=1 obj=0 op='UNION-ALL  (cr=0 pr=0 pw=0 time=11 us)'
STAT #140651664107648 id=4 cnt=1 pid=3 pos=1 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=1 us cost=2 size=0 card=1)'
STAT #140651664107648 id=5 cnt=1 pid=3 pos=2 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140651664107648 id=6 cnt=1 pid=3 pos=3 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140651664107648 id=7 cnt=1 pid=3 pos=4 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140651664107648 id=8 cnt=1 pid=1 pos=2 obj=0 op='VIEW  VW_NSO_1 (cr=0 pr=0 pw=0 time=193 us cost=31 size=424736 card=8168)'
STAT #140651664107648 id=9 cnt=1 pid=8 pos=1 obj=0 op='NESTED LOOPS  (cr=0 pr=0 pw=0 time=191 us cost=31 size=16336 card=8168)'
STAT #140651664107648 id=10 cnt=1 pid=9 pos=1 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140651664107648 id=11 cnt=1 pid=9 pos=2 obj=0 op='COLLECTION ITERATOR PICKLER FETCH F_STR_TO_TBLV (cr=0 pr=0 pw=0 time=189 us cost=29 size=16336 card=8168)'

*** 2016-06-07 08:40:56.535
WAIT #140651664107648: nam='SQL*Net message from client' ela= 5155422 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1335959280565


Так же работает и такой вариант.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as (
      select 1 id, 'name1' name from dual union all
      select 2 id, 'name2' name from dual union all
      select 3 id, 'name3' name from dual union all
      select 4 id, 'name4' name from dual 
      )
    select id, name
    from t 
    where :lv_v1 = '0' 
      or to_char(id) in ( select t1.column_value  from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar)) t1
                         );


Код: 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.
PARSING IN CURSOR #140651662436320 len=420 dep=0 uid=12962 oct=3 lid=12962 tim=1335986293726 hv=1985385659 ad='3d14e9220' sqlid='5w0a1sjv5d55v'
with t as (
      select 1 id, 'name1' name from dual union all
      select 2 id, 'name2' name from dual union all
      select 3 id, 'name3' name from dual union all
      select 4 id, 'name4' name from dual 
      )
    select id, name
    from t 
    where :lv_v1 = '0' 
      or to_char(id) in ( select t1.column_value  from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar)) t1
                         )
END OF STMT
PARSE #140651662436320:c=0,e=360,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=1335986293725
...
BINDS #140651662436320:
 Bind#0
  oacdty=01 mxl=32(01) mxlc=01 mal=00 scl=00 pre=00
  oacflg=01 fl2=1000010 frm=01 csi=171 siz=32 off=0
  kxsbbbfp=7fec046065b8  bln=32  avl=01  flg=05
  value="0"
 Bind#1
  No oacdef for this bind.
EXEC #140651662436320:c=5000,e=5039,p=0,cr=33,cu=0,mis=1,r=0,dep=0,og=1,plh=3749468511,tim=1335986298854
WAIT #140651662436320: nam='SQL*Net message to client' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1335986298906
FETCH #140651662436320:c=0,e=17,p=0,cr=0,cu=0,mis=0,r=4,dep=0,og=1,plh=3749468511,tim=1335986298948
STAT #140651662436320 id=1 cnt=4 pid=0 pos=1 obj=0 op='FILTER  (cr=0 pr=0 pw=0 time=10 us)'
STAT #140651662436320 id=2 cnt=4 pid=1 pos=1 obj=0 op='VIEW  (cr=0 pr=0 pw=0 time=9 us cost=8 size=40 card=4)'
STAT #140651662436320 id=3 cnt=4 pid=2 pos=1 obj=0 op='UNION-ALL  (cr=0 pr=0 pw=0 time=8 us)'
STAT #140651662436320 id=4 cnt=1 pid=3 pos=1 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=1 us cost=2 size=0 card=1)'
STAT #140651662436320 id=5 cnt=1 pid=3 pos=2 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140651662436320 id=6 cnt=1 pid=3 pos=3 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140651662436320 id=7 cnt=1 pid=3 pos=4 obj=0 op='FAST DUAL  (cr=0 pr=0 pw=0 time=0 us cost=2 size=0 card=1)'
STAT #140651662436320 id=8 cnt=0 pid=1 pos=2 obj=0 op='COLLECTION ITERATOR PICKLER FETCH F_STR_TO_TBLV (cr=0 pr=0 pw=0 time=0 us cost=2 size=2 card=1)'

*** 2016-06-07 08:41:28.184
WAIT #140651662436320: nam='SQL*Net message from client' ela= 4630627 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=1335990929693
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251647
не по теме
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
  lv_str long default pv_str||',';

Декларируете long, потому что лень явно указать длину 32767 см?
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251970
Asmodeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В 11.2.0.{3,4} поведение аналогично наблюдаемому в 12.0.1.2, так что "сломали" TABLE раньше.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39251995
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AsmodeusВ 11.2.0.{3,4} поведение аналогично наблюдаемому в 12.0.1.2, так что "сломали" TABLE раньше.
офтоп
ну, сломали и сломали, мало ли что ломают?
а вот то, что с тех пор не починили - это (имхо) симптом того, что нафиг оно.. (т.е. горячим спросом не пользуется )
тут обсуждались похожие дрова via gtt

соответственно, ещё +1 за gtt (просто не ходите по болоту..)
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252012
не понял по поводу "работает", если в трейсе все равно присутствует второй бинд и все также не прикаян.
попробуй теперь вместо '0' задать '1,2'.
но вообще, биндь массив, а не строку. и функция тогда не нужна.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252027
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
инстр/лайк (неиндекс)не понял по поводу "работает", если в трейсе все равно присутствует второй бинд и все также не прикаян.Кто-то что-то точно не понял . И ТС тоже.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252125
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
так все ок:umalov
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t 
where case :lv_v1 when '0' then '0' else to_char(id) end 
  in (
      select/*+ no_unnest */ t1.column_value  from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar)) t1
      );

и при материализации тоже:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with v as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
,t as (select/*+ materialize */ * from v)
select id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where decode(:lv_v1,'0','0',to_char(id)) = t1.v
;


А если для дебага создать такую функцию:
Код: plsql
1.
2.
3.
4.
5.
create or replace function str_debug(v varchar2) return varchar2 as
begin
   dbms_output.put_line('v = '||v);
   return v;
end;


и запустим запрос:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v
;

то увидим, что функция вообще не вызывалась...
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252132
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
какая-то хрень именно при hash join/hash join semi...
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252136
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Код: 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.
with v as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
,t as (select * from v)
select id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1;

        ID NAME
---------- -----
         1 name1
         2 name2
         3 name3
         4 name4

--var lv_v1 varchar2(10)
--var lv_v2 varchar2(10)

--exec :lv_v1 := '0';
--exec :lv_v2 := '0';
--...
--where decode(:lv_v2,'0','0',to_char(id)) = t1.v;

надо смотреть ссылку Елика
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252148
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dba123,

а по ссылке ничего не объясняется и никак не описана зависимость от плана. Проблема только при HASH JOIN / HASH JOIN SEMI:
HJ
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
variable lv_v1 varchar2(10)
exec :lv_v1 := '0';

alter session set statistics_level=all;
--set serverout on;

with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v
;

select * from table(dbms_xplan.display_cursor('','','allstats last +projection'));
--set serverout off;

MERGE JOIN
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
variable lv_v1 varchar2(10)
exec :lv_v1 := '0';

alter session set statistics_level=all;
--set serverout on;

with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select/*+ use_merge(t t1) */ id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v
;

select * from table(dbms_xplan.display_cursor('','','allstats last +projection'));
--set serverout off;



Результаты:
HJ
Код: 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.
no rows selected


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
SQL_ID  b752wg7gkj9b3, child number 0
-------------------------------------
with t as (   select 1 id, 'name1' name from dual union all   select 2
id, 'name2' name from dual union all   select 3 id, 'name3' name from
dual union all   select 4 id, 'name4' name from dual   ) select id,
name from t, (select column_value v from table
(cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1 where
str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v

Plan hash value: 2286199128

-------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name          | Starts | E-Rows | A-Rows |   A-Time   |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |               |      1 |        |      0 |00:00:00.01 |       |       |          |
|*  1 |  HASH JOIN                         |               |      1 |    327 |      0 |00:00:00.01 |  1753K|  1753K| 1021K (0)|
|   2 |   VIEW                             |               |      1 |      4 |      4 |00:00:00.01 |       |       |          |
|   3 |    UNION-ALL                       |               |      1 |        |      4 |00:00:00.01 |       |       |          |
|   4 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   5 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   6 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   7 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   8 |   COLLECTION ITERATOR PICKLER FETCH| F_STR_TO_TBLV |      1 |   8168 |      1 |00:00:00.01 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("STR_DEBUG"(DECODE(:LV_V1,'0','0',TO_CHAR("ID")))=VALUE(KOKBF$))

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=1) "ID"[NUMBER,2], "NAME"[CHARACTER,5]
   2 - "ID"[NUMBER,2], "NAME"[CHARACTER,5]
   3 - STRDEF[2], STRDEF[5]
   8 - VALUE(A0)[100]


MERGE JOIN
Код: 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.
        ID NAME
---------- -----
         1 name1
         4 name4
         3 name3
         2 name2


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
SQL_ID  5755z6xzcthkv, child number 0
-------------------------------------
with t as (   select 1 id, 'name1' name from dual union all   select 2
id, 'name2' name from dual union all   select 3 id, 'name3' name from
dual union all   select 4 id, 'name4' name from dual   ) select/*+
use_merge(t t1) */ id, name from t, (select column_value v from table
(cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1 where
str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v

Plan hash value: 771960547

--------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name          | Starts | E-Rows | A-Rows |   A-Time   |  OMem |  1Mem | Used-Mem |
--------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |               |      1 |        |      4 |00:00:00.01 |       |       |          |
|   1 |  MERGE JOIN                         |               |      1 |    327 |      4 |00:00:00.01 |       |       |          |
|   2 |   SORT JOIN                         |               |      1 |      4 |      4 |00:00:00.01 |  9216 |  9216 | 8192  (0)|
|   3 |    VIEW                             |               |      1 |      4 |      4 |00:00:00.01 |       |       |          |
|   4 |     UNION-ALL                       |               |      1 |        |      4 |00:00:00.01 |       |       |          |
|   5 |      FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   6 |      FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   7 |      FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   8 |      FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|*  9 |   SORT JOIN                         |               |      4 |   8168 |      4 |00:00:00.01 |  2048 |  2048 | 2048  (0)|
|  10 |    COLLECTION ITERATOR PICKLER FETCH| F_STR_TO_TBLV |      1 |   8168 |      1 |00:00:00.01 |       |       |          |
--------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   9 - access("STR_DEBUG"(DECODE(:LV_V1,'0','0',TO_CHAR("ID")))=VALUE(KOKBF$))
       filter("STR_DEBUG"(DECODE(:LV_V1,'0','0',TO_CHAR("ID")))=VALUE(KOKBF$))

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "ID"[NUMBER,2], "NAME"[CHARACTER,5]
   2 - (#keys=1) "STR_DEBUG"(DECODE(:LV_V1,'0','0',TO_CHAR("ID")))[4000], "ID"[NUMBER,2], "NAME"[CHARACTER,5]
   3 - "ID"[NUMBER,2], "NAME"[CHARACTER,5]
   4 - STRDEF[2], STRDEF[5]
   9 - (#keys=1) VALUE(KOKBF$)[100]
  10 - VALUE(A0)[100]

...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252153
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Имхо очевидно, что проблема в построении hash-таблицы, т.к. если изменить порядок, то тоже все ок:
Код: 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.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select/*+ leading(t1 t) use_hash(t) */ id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v
;
        ID NAME
---------- -----
         1 name1
         2 name2
         3 name3
         4 name4


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------------------------
SQL_ID  8ynsfzfjghja3, child number 0
-------------------------------------
with t as (   select 1 id, 'name1' name from dual union all   select 2
id, 'name2' name from dual union all   select 3 id, 'name3' name from
dual union all   select 4 id, 'name4' name from dual   ) select/*+
leading(t1 t) use_hash(t) */ id, name from t, (select column_value v
from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v

Plan hash value: 561691895

-------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name          | Starts | E-Rows | A-Rows |   A-Time   |  OMem |  1Mem | Used-Mem |
-------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |               |      1 |        |      4 |00:00:00.01 |       |       |          |
|*  1 |  HASH JOIN                         |               |      1 |    327 |      4 |00:00:00.01 |  1969K|  1969K|  564K (0)|
|   2 |   COLLECTION ITERATOR PICKLER FETCH| F_STR_TO_TBLV |      1 |   8168 |      1 |00:00:00.01 |       |       |          |
|   3 |   VIEW                             |               |      1 |      4 |      4 |00:00:00.01 |       |       |          |
|   4 |    UNION-ALL                       |               |      1 |        |      4 |00:00:00.01 |       |       |          |
|   5 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   6 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   7 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
|   8 |     FAST DUAL                      |               |      1 |      1 |      1 |00:00:00.01 |       |       |          |
-------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access("STR_DEBUG"(DECODE(:LV_V1,'0','0',TO_CHAR("ID")))=VALUE(KOKBF$))

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=1) "ID"[NUMBER,2], "NAME"[CHARACTER,5]
   2 - VALUE(A0)[100]
   3 - "ID"[NUMBER,2], "NAME"[CHARACTER,5]
   4 - STRDEF[2], STRDEF[5]

...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252249
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
еще забавно, что так все ок:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where decode(str_debug(:lv_v2),'0','0',to_char(id)) = t1.v
;

а вот так - опять все плохо
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
  select 1 id, 'name1' name from dual union all
  select 2 id, 'name2' name from dual union all
  select 3 id, 'name3' name from dual union all
  select 4 id, 'name4' name from dual 
  )
select id, name
from t, (select column_value v from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar))) t1
where decode(str_debug(:lv_v2),'0',str_debug(:lv_v1),to_char(id)) = t1.v
;

и опять ничего не str_debug не выводит :)
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252496
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снял trace на 9-ке.
Выборка работает - но так же в trace присутствует - bind 1: (No oacdef for this bind)
Код: plsql
1.
 Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production



Код: 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.
PARSING IN CURSOR #3 len=411 dep=0 uid=15730 oct=3 lid=15730 tim=64279474700929 hv=2307946252 ad='49e8d090'
with t as (
    select 1 id, 'name1' name from dual union all
    select 2 id, 'name2' name from dual union all
    select 3 id, 'name3' name from dual union all
    select 4 id, 'name4' name from dual 
  )
    select id, name
    from t 
  where case :lv_v1 when '0' then '0' else to_char(id) end
  in (
      select t1.column_value  from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar)) t1
      )
END OF STMT
PARSE #3:c=0,e=684,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=0,tim=64279474700926
BINDS #3:
 bind 0: dty=1 mxl=32(02) mal=00 scl=00 pre=00 oacflg=01 oacfl2=10 size=32 offset=0
   bfp=110373b60 bln=32 avl=01 flg=05
   value="0"
 bind 1: (No oacdef for this bind)
EXEC #3:c=0,e=89,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=64279474703828
WAIT #3: nam='SQL*Net message to client' ela= 2 p1=1413697536 p2=1 p3=0
FETCH #3:c=0,e=402,p=0,cr=12,cu=0,mis=0,r=4,dep=0,og=4,tim=64279474704268
WAIT #3: nam='SQL*Net message from client' ela= 5370428 p1=1413697536 p2=1 p3=0



...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252516
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umalovно так же в trace присутствует - bind 1: (No oacdef for this bind)Раз уж так и не понял, что это значит, то хотя бы перестань обращать на это внимание.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252964
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

На мой взгляд, есть некоторая зависимость от плана

Видимо сейчас, когда присутствует коллекция и таблица|представление надо
строить ключи хэш-таблицы именно по коллекции(use leading|ordered), а не по таблице|вьюхе,
какими бы мелкими последние не были.
Между таблицами у меня не получилось воспроизвести.

Код: 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.
-- err, no rows selected
--
explain plan for
with t as (
   select 1 id, 'name1' name from dual union all
   select 2 id, 'name2' name from dual union all
   select 3 id, 'name3' name from dual union all
   select 4 id, 'name4' name from dual 
   )
select /*+ ordered */ id, name
from t, (select column_value v from table(f_str_to_tblv(:lv_v1))) t1
where str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v;

select * from table(dbms_xplan.display);

----------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |               |   327 |  3924 |    37   (0)| 00:00:01 |
|*  1 |  HASH JOIN                         |               |   327 |  3924 |    37   (0)| 00:00:01 |
|   2 |   VIEW                             |               |     4 |    40 |     8   (0)| 00:00:01 |
|   3 |    UNION-ALL                       |               |       |       |            |          |
|   4 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
|   5 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
|   6 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
|   7 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
|   8 |   COLLECTION ITERATOR PICKLER FETCH| F_STR_TO_TBLV |  8168 | 16336 |    29   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------

delete from plan_table;

-- ok
--
explain plan for
with t as (
   select 1 id, 'name1' name from dual union all
   select 2 id, 'name2' name from dual union all
   select 3 id, 'name3' name from dual union all
   select 4 id, 'name4' name from dual 
   )
select /*+ ordered */ id, name
from (select column_value v from table(f_str_to_tblv(:lv_v1))) t1, t
where str_debug(decode(:lv_v1,'0','0',to_char(id))) = t1.v;

select * from table(dbms_xplan.display);
----------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |               |   327 |  3924 |    37   (0)| 00:00:01 |
|*  1 |  HASH JOIN                         |               |   327 |  3924 |    37   (0)| 00:00:01 |
|   2 |   COLLECTION ITERATOR PICKLER FETCH| F_STR_TO_TBLV |  8168 | 16336 |    29   (0)| 00:00:01 |
|   3 |   VIEW                             |               |     4 |    40 |     8   (0)| 00:00:01 |
|   4 |    UNION-ALL                       |               |       |       |            |          |
|   5 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
|   6 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
|   7 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
|   8 |     FAST DUAL                      |               |     1 |       |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252988
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dba123,

я же все это более понятно описал выше:
xtenderПроблема только при HASH JOIN / HASH JOIN SEMI:xtenderИмхо очевидно, что проблема в построении hash-таблицы, т.к. если изменить порядок, то тоже все ок:
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39252992
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
dba123Между таблицами у меня не получилось воспроизвести.это тоже очевидно, т.к. простая материализация помогает: 19267733
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39277950
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Наконец пришёл ответ из саппорта.
Сначала предложили использовать хинт /*+ merge_sj */
/*+ merge_sj */
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t as (
select 1 id, 'name1' name from dual union all
select 2 id, 'name2' name from dual union all
select 3 id, 'name3' name from dual union all
select 4 id, 'name4' name from dual
)
select id, name
from t
where case :lv_v1 when '0' then '0' else to_char(id) end
in (
select /*+ merge_sj */ t1.column_value from table (cast(f_str_to_tblv(:lv_v1) as tps_tabletype_varchar)) t1
);



На наш вопрос, можно ли решить проблему без изменения кода, прислали такой вариант.
Код: plsql
1.
ALTER SESSION SET "_always_semi_join" = 'OFF'; 


Проверил - работает.
...
Рейтинг: 0 / 0
Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
    #39277990
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
umalov,

так это только workaround, а само исправление-то будет?
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Возникла непонятная ситуация при подготовки к переходу с 9 на 12-ю версию Oracle.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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