Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормоза при join-е нескольких таблиц чероз DBlink / 25 сообщений из 54, страница 1 из 3
18.08.2016, 10:43
    #39293747
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
Есть БД в которую нельзя вносить изменения - сторонняя БД источник данных (Source).
Есть БД - приёмник данных (Dest).
В dest есть линк на source. Если запрос идет к одной таблице, то выполняется быстро.
Если запрос усложнить, добавить джойны и подселекты (все таблицы на стороне source), то начинаются тормоза. таблицы с кол-во строк около миллиона, а селекты выполняются по 15 минут. Хотя тоже селект, если выполнить его на стороне source - выполняется мгновенно, т.е. индексы есть.
Я конечно понимаю, что линк идет на конкретную таблицу, и что джойны скорее всего выполняются уже на стороне desc (прав?), никакие хины и т.д. не передаются. но как быть?
Это еще и в динамическом SQL все, т.к. источников много и в динамике подставляется имя линка.
Думал выполнить динамический SQL через DBMS_SQL...@линк на стороне source, но как прочитать курсор?
Есть ли реальный способ выполнить запрос на стороне сорса и получть результат на ps/sql или только ява?
...
Рейтинг: 0 / 0
18.08.2016, 11:48
    #39293813
DRIVING_SITE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
попробуй хинт DRIVING_SITE
...
Рейтинг: 0 / 0
18.08.2016, 13:30
    #39293885
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
DRIVING_SITE,

спасибо.
еще тут почитал, скорее всего поможет
...
Рейтинг: 0 / 0
02.02.2017, 11:49
    #39397098
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
Есть простой запрос к удаленной БД (в ней нельзя создавать никакие объекты)
Код: 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.
select /*+  DRIVING_SITE(x) */
       x.TERM_ISS_NUM,
       x.TERM_NUM,
       trunc(sysdate) BEGIN_DATE,
       null END_DATE,
       x.ISSUER_NUM
  from (
select t.ID_EMITENT TERM_ISS_NUM,
       t.NOMER_TERMINALA TERM_NUM,
       i.EMITENT ISSUER_NUM         
  from XXX.ECFIL005@XXX i
  cross join XXX.P5CONFIG@XXX c
  join XXX.ECFIL030@XXX t on (t.ID_EMITENT = c.ID_EMITENT and t.ID_FILIAL = c.ID_FILIAL)
  join XXX.ECFIL037@XXX r on (t.ID_EMITENT = r.ID_EMITENT and t.ID_TO = r.ID_TOCHKI_OBSLUGIVANIYA )
where 1=1
  and i.FLAG_ACTIVNOSTY = 1 
  and i.EMITENT != t.ID_EMITENT
  and not exists (select null
                    from XXX.ECFIL149@XXX b
                   where b.GRAF_NOMER_KARTY = t.NOMER_TERMINALA
                     and b.NOMER_TERM = i.EMITENT
                     and b.DLYA_EMITENTOV = 0
                     and b.FOR_LNR = 0)   
) x   



Выполняется и фетчица из девелопера и через for loop за 6 секунд.
Код: 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.
declare 
 v1 number;
 v2 number;
 v3 date;
 v4 date;
 v5 number;
i integer :=0;
c sys_refcursor;
begin
   for  c in (
select /*+  DRIVING_SITE(x) */
       x.TERM_ISS_NUM,
       x.TERM_NUM,
       trunc(sysdate) BEGIN_DATE,
       null END_DATE,
       x.ISSUER_NUM
  from (
select t.ID_EMITENT TERM_ISS_NUM,
       t.NOMER_TERMINALA TERM_NUM,
       i.EMITENT ISSUER_NUM         
  from XXX.ECFIL005@XXX i
  cross join XXX.P5CONFIG@XXX c
  join XXX.ECFIL030@XXX t on (t.ID_EMITENT = c.ID_EMITENT and t.ID_FILIAL = c.ID_FILIAL)
  join XXX.ECFIL037@XXX r on (t.ID_EMITENT = r.ID_EMITENT and t.ID_TO = r.ID_TOCHKI_OBSLUGIVANIYA )
where 1=1
  and i.FLAG_ACTIVNOSTY = 1 
  and i.EMITENT != t.ID_EMITENT
  and not exists (select null
                    from XXX.ECFIL149@XXX b
                   where b.GRAF_NOMER_KARTY = t.NOMER_TERMINALA
                     and b.NOMER_TERM = i.EMITENT
                     and b.DLYA_EMITENTOV = 0
                     and b.FOR_LNR = 0)   
) x                 
   )
   loop
      v1 := c.TERM_ISS_NUM;
      v2 := c.TERM_NUM;
      v3 := c.BEGIN_DATE;
      v4 := c.END_DATE;
      v5 := c.ISSUER_NUM;
      i := i + 1;
   end loop;   
   dbms_output.put_line(to_char(i));
end;   
   




но мне нужно сделать его диначически т.к. удаленных БД 80 штук.
как только я переписываю его на open for
Код: 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.
declare 
 v1 number;
 v2 number;
 v3 date;
 v4 date;
 v5 number;
i integer :=0;
c sys_refcursor;
begin
   open c for 
'select /*+  DRIVING_SITE(x) */
       x.TERM_ISS_NUM,
       x.TERM_NUM,
       trunc(sysdate) BEGIN_DATE,
       null END_DATE,
       x.ISSUER_NUM
  from (
select t.ID_EMITENT TERM_ISS_NUM,
       t.NOMER_TERMINALA TERM_NUM,
       i.EMITENT ISSUER_NUM         
  from XXX.ECFIL005@XXX i
  cross join XXX.P5CONFIG@XXX c
  join XXX.ECFIL030@XXX t on (t.ID_EMITENT = c.ID_EMITENT and t.ID_FILIAL = c.ID_FILIAL)
  join XXX.ECFIL037@XXX r on (t.ID_EMITENT = r.ID_EMITENT and t.ID_TO = r.ID_TOCHKI_OBSLUGIVANIYA )
where 1=1
  and i.FLAG_ACTIVNOSTY = 1 
  and i.EMITENT != t.ID_EMITENT
  and not exists (select null
                    from XXX.ECFIL149@XXX b
                   where b.GRAF_NOMER_KARTY = t.NOMER_TERMINALA
                     and b.NOMER_TERM = i.EMITENT
                     and b.DLYA_EMITENTOV = 0
                     and b.FOR_LNR = 0)   
) x         '            
   ;
   loop
      fetch c into v1,v2,v3,v4,v5;
      exit when c%notfound;
      i := i + 1;
   end loop;   
   dbms_output.put_line(to_char(i));
end;   
   



или на dbms_sql
Код: 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.
declare 
 v1 number;
 v2 number;
 v3 date;
 v4 date;
 v5 number;
i integer :=0;
rc integer;
c integer;
begin
   c := dbms_sql.open_cursor;
   dbms_sql.parse(c, '
select /*+  DRIVING_SITE(x) */
       x.TERM_ISS_NUM,
       x.TERM_NUM,
       trunc(sysdate) BEGIN_DATE,
       null END_DATE,
       x.ISSUER_NUM
  from (
select t.ID_EMITENT TERM_ISS_NUM,
       t.NOMER_TERMINALA TERM_NUM,
       i.EMITENT ISSUER_NUM         
  from XXX.ECFIL005@XXX i
  cross join XXX.P5CONFIG@XXX c
  join XXX.ECFIL030@XXX t on (t.ID_EMITENT = c.ID_EMITENT and t.ID_FILIAL = c.ID_FILIAL)
  join XXX.ECFIL037@XXX r on (t.ID_EMITENT = r.ID_EMITENT and t.ID_TO = r.ID_TOCHKI_OBSLUGIVANIYA )
where 1=1
  and i.FLAG_ACTIVNOSTY = 1 
  and i.EMITENT != t.ID_EMITENT
  and not exists (select null
                    from XXX.ECFIL149@XXX b
                   where b.GRAF_NOMER_KARTY = t.NOMER_TERMINALA
                     and b.NOMER_TERM = i.EMITENT
                     and b.DLYA_EMITENTOV = 0
                     and b.FOR_LNR = 0)   
) x  '
, dbms_sql.native);
   dbms_sql.define_column(c, 1, v1);
   dbms_sql.define_column(c, 2, v2);
   dbms_sql.define_column(c, 3, v3);
   dbms_sql.define_column(c, 4, v4);
   dbms_sql.define_column(c, 5, v5);            
   rc :=  dbms_sql.execute(c);
   loop
      if dbms_sql.fetch_rows(c) = 0 then 
         exit;
      else 
         i := i + 1;         
      end if;

   end loop;   
   dbms_sql.close_cursor(c);   
   dbms_output.put_line(to_char(i));
end;   
   




выполнение занимает минут 15-20.

Что за беда и как победить?
...
Рейтинг: 0 / 0
02.02.2017, 11:52
    #39397102
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
OPEN FOR даже без динамики тормозит 15-20 минут
Код: 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.
declare 
 v1 number;
 v2 number;
 v3 date;
 v4 date;
 v5 number;
i integer :=0;
c sys_refcursor;
begin
   open c for 
select /*+  DRIVING_SITE(x) */
       x.TERM_ISS_NUM,
       x.TERM_NUM,
       trunc(sysdate) BEGIN_DATE,
       null END_DATE,
       x.ISSUER_NUM
  from (
select t.ID_EMITENT TERM_ISS_NUM,
       t.NOMER_TERMINALA TERM_NUM,
       i.EMITENT ISSUER_NUM         
  from XXX.ECFIL005@XXX i
  cross join XXX.P5CONFIG@XXX c
  join XXX.ECFIL030@XXX t on (t.ID_EMITENT = c.ID_EMITENT and t.ID_FILIAL = c.ID_FILIAL)
  join XXX.ECFIL037@XXX r on (t.ID_EMITENT = r.ID_EMITENT and t.ID_TO = r.ID_TOCHKI_OBSLUGIVANIYA )
where 1=1
  and i.FLAG_ACTIVNOSTY = 1 
  and i.EMITENT != t.ID_EMITENT
  and not exists (select null
                    from XXX.ECFIL149@XXX b
                   where b.GRAF_NOMER_KARTY = t.NOMER_TERMINALA
                     and b.NOMER_TERM = i.EMITENT
                     and b.DLYA_EMITENTOV = 0
                     and b.FOR_LNR = 0)   
) x                     
   ;
   loop
      fetch c into v1,v2,v3,v4,v5;
      exit when c%notfound;
      i := i + 1;
   end loop;   
   dbms_output.put_line(to_char(i));
end;   
...
Рейтинг: 0 / 0
02.02.2017, 12:12
    #39397127
fortnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
А если использовать просто курсор, а не sys_refcursor ?

CURSOR c IS
SELECT /*+ DRIVING_SITE(x) */

...
open c;
...
Рейтинг: 0 / 0
02.02.2017, 13:52
    #39397217
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
fortnetА если использовать просто курсор, а не sys_refcursor ?

CURSOR c IS
SELECT /*+ DRIVING_SITE(x) */

...
open c;
тоже самое - тормоза
...
Рейтинг: 0 / 0
02.02.2017, 13:55
    #39397224
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
не понятно вообще в чем проблема то. один и тот-же запрос же.
...
Рейтинг: 0 / 0
02.02.2017, 13:59
    #39397227
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
oracle 11.2.0.4
...
Рейтинг: 0 / 0
02.02.2017, 14:04
    #39397233
fortnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
Можно еще попробовать execute immediate , где на вход подается clob-sql

c clob;

execute immediate c;
...
Рейтинг: 0 / 0
02.02.2017, 14:14
    #39397251
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
fortnetМожно еще попробовать execute immediate , где на вход подается clob-sql

c clob;

execute immediate c;
началось
результат нужно запихнуть в локальную таблицу
было
execute immediate 'insert into TTTT () select ....';
и жутко тормозило.
хотя сам запрос выполняется быстро и в for c in loop быстро.
...
Рейтинг: 0 / 0
02.02.2017, 14:15
    #39397252
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
barrabasfortnetМожно еще попробовать execute immediate , где на вход подается clob-sql

c clob;

execute immediate c;
началось
результат нужно запихнуть в локальную таблицу
было
execute immediate 'insert into TTTT () select ....';
и жутко тормозило.
хотя сам запрос выполняется быстро и в for c in loop быстро.
с execute immediate началось ...
...
Рейтинг: 0 / 0
02.02.2017, 14:30
    #39397268
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
barrabasfortnetМожно еще попробовать execute immediate , где на вход подается clob-sql

c clob;

execute immediate c;
началось
результат нужно запихнуть в локальную таблицу
было
execute immediate ' insert into TTTT () select ....';
и жутко тормозило.
хотя сам запрос выполняется быстро и в for c in loop быстро.Вот это уже ближе к телу
При DML никакой DRIVING_SITE работать не будет, все будет выполнятся на стороне обновляемой таблички
...
Рейтинг: 0 / 0
02.02.2017, 14:31
    #39397269
fortnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
ну печально,
здесь пишут, что работает c курсором
http://www.sqlrunning.com/?p=66
...
Рейтинг: 0 / 0
02.02.2017, 14:35
    #39397274
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
По идее должно работать BULK COLLECT и FORALL INSERT (через локальную коллекцию)
Но у тебя, насколько я понял и с динамическим SQL для обычного SELECT проблемы
...
Рейтинг: 0 / 0
02.02.2017, 14:44
    #39397283
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
А ты запрос-то весь показываешь?
Передача параметров там... или еще какие тонкости
...
Рейтинг: 0 / 0
02.02.2017, 14:47
    #39397292
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
fortnetну печально,
здесь пишут, что работает c курсором
http://www.sqlrunning.com/?p=66
так работает за 2 секунды (фетч)

Код: 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.
declare 
 v1 number;
 v2 number;
 v3 date;
 v4 date;
 v5 number;
i integer :=0;
cursor CUR is 
select /*+  DRIVING_SITE(x) */
       x.TERM_ISS_NUM,
       x.TERM_NUM,
       trunc(sysdate) BEGIN_DATE,
       null END_DATE,
       x.ISSUER_NUM
  from (
select /*+ DRIVING_SITE(i) 
           DRIVING_SITE(c)
           DRIVING_SITE(t)
           DRIVING_SITE(r)           
        */
       t.ID_EMITENT TERM_ISS_NUM,
       t.NOMER_TERMINALA TERM_NUM,       
       i.EMITENT ISSUER_NUM         
  from MAGICASH5.ECFIL005@MAG835 i
  cross join MAGICASH5.P5CONFIG@MAG835 c
  join MAGICASH5.ECFIL030@MAG835 t on (t.ID_EMITENT = c.ID_EMITENT and t.ID_FILIAL = c.ID_FILIAL)
  join MAGICASH5.ECFIL037@MAG835 r on (t.ID_EMITENT = r.ID_EMITENT and t.ID_TO = r.ID_TOCHKI_OBSLUGIVANIYA )
where 1=1
  and i.FLAG_ACTIVNOSTY = 1 
  and i.EMITENT != t.ID_EMITENT
  and not exists (select /*+ DRIVING_SITE(b) */ null
                    from MAGICASH5.ECFIL149@MAG835 b
                   where b.GRAF_NOMER_KARTY = t.NOMER_TERMINALA
                     and b.NOMER_TERM = i.EMITENT
                     and b.DLYA_EMITENTOV = 0
                     and b.FOR_LNR = 0)   
) x     
;

   type CurRowsType is table of CUR%rowtype;
   vRows CurRowsType;

begin
   open CUR;
   loop
      fetch CUR BULK COLLECT INTO vRows LIMIT 5000;
      for z in 1..vRows.count loop
         i := i + 1;   
      end loop;
--      forall i in rec1_tab.first..rec1_tab.last           INSERT INTO local_emp VALUES rec1_tab(i);   
      exit when CUR%notfound;
  
  end loop;
  dbms_output.put_line(to_char(i))      ;
/*
   loop
      fetch c into v1,v2,v3,v4,v5;
      exit when c%notfound;
      i := i + 1;
   end loop;   
   dbms_output.put_line(to_char(i));*/
end;   
   



теперь это в динамический SQL нужно превратить
...
Рейтинг: 0 / 0
02.02.2017, 14:48
    #39397293
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
хинты DRIVING_SITE в подселектах роль не играют, пробовал и с ними и без
...
Рейтинг: 0 / 0
02.02.2017, 14:55
    #39397306
fortnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
запихни в execute immediate весь блок
...
Рейтинг: 0 / 0
02.02.2017, 14:56
    #39397307
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
получилось через open c for 'select ...'
fetch c bulk collect into lomit

всем спасибо.
уж как залетает все скоро :)
...
Рейтинг: 0 / 0
02.02.2017, 14:59
    #39397309
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
fortnetзапихни в execute immediate весь блок
я тест через несколько массивов сделал (по хорошему массив рекордов будет в итоге)
Код: 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.
declare 
 v1 SYS.ODCINumberList;
 v2 SYS.ODCINumberList; 
 v3 SYS.ODCIDateList; 
 v4 SYS.ODCIDateList; 
 v5 SYS.ODCINumberList; 
i integer :=0;
c sys_refcursor;
begin
   open c for '
select /*+  DRIVING_SITE(x) */
       x.TERM_ISS_NUM,
       x.TERM_NUM,
       x.BEGIN_DATE,
       x.END_DATE,
       x.ISSUER_NUM
  from (
select 
       t.ID_EMITENT TERM_ISS_NUM,
       t.NOMER_TERMINALA TERM_NUM,
       trunc(sysdate) BEGIN_DATE,
       null END_DATE,
       i.EMITENT ISSUER_NUM         
  from XXX.P5CONFIG@XXX c
  join XXX.ECFIL030@XXX t on (t.ID_EMITENT = c.ID_EMITENT and t.ID_FILIAL = c.ID_FILIAL)
  join XXX.ECFIL005@XXX i on (i.FLAG_ACTIVNOSTY = 1 and i.EMITENT != t.ID_EMITENT)
  join XXX.ECFIL037@XXX r on (t.ID_EMITENT = r.ID_EMITENT and t.ID_TO = r.ID_TOCHKI_OBSLUGIVANIYA )
where 1=1
  and not exists (select null
                    from XXX.ECFIL149@XXX b
                   where b.GRAF_NOMER_KARTY = t.NOMER_TERMINALA
                     and b.NOMER_TERM = i.EMITENT
                     and b.DLYA_EMITENTOV = 0
                     and b.FOR_LNR = 0)   
) x                     
   ';
   loop
      fetch c bulk collect into v1,v2,v3,v4,v5 limit 50000;
      for z in 1..v1.count loop
         i := i + 1;   
      end loop;
      exit when c%notfound;

   end loop;   
   dbms_output.put_line(to_char(i));
end;   
   
...
Рейтинг: 0 / 0
02.02.2017, 15:39
    #39397352
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
еще момент.
данные вставляются в буферную таблицу
если нужно локальную фильтрацию замутить.
сделать простой перебор массива с фильтром и одиночными инсертами или forall с последующей массовой фильтрацией и удалением или отметкой в буфере.
что лучше?

склоняюсь ко второму варианту.
...
Рейтинг: 0 / 0
02.02.2017, 15:42
    #39397356
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
хотя если фильтр уберет существенное кол-во данных то наверное лучше до вставки не доводить даже, т.е. вариант 1
...
Рейтинг: 0 / 0
02.02.2017, 16:05
    #39397383
fortnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
Интересно, что с fetch хинт не влияет на план запроса , а с fetch bulk collect влияет.
...
Рейтинг: 0 / 0
02.02.2017, 16:15
    #39397399
barrabas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Тормоза при join-е нескольких таблиц чероз DBlink
у меня есть рабочий код (собственно для которого я давно создавал тему), где идет вставка в локальную таблицу из нескольких линкованных таблиц через execute immediate. без хинта висит по полчаса, с хинтом пара минут всего
хотя Вячеслав Любомудров утверждал обратное.

Код: 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.
    GetDbLinkByExtAppName(vExtAppName, vExtAppId, vDbLink, vDbScheme, vExtraSchema);
             
      script:=
      
     'insert into BUF_CARD (REC_ID,
                            PACKAGE_NUM,
                            STATUS,
                            ERROR_NUM,
                            EXT_APP_NAME,
                            EXT_APP_ID,
                            FLAG_ERROR,
                            CARD_NUM,  
                            INT_SUBJ_ID,
                            SUBJ_NAME,
                            CARD_STATUS,
                            CARD_REM,
                            CARD_STATUS_DATE,
                            CARD_TYPE_ID,
                            FLAG_LIMIT_SCHEME,
                            ISSUE_DATE)  
      select /*+ DRIVING_SITE(j) */ 
             seq_buf_card.NEXTVAL, '||vPackageNum||',   
             ''N'', 0, '''||vExtAppName||''', '||vExtAppId||', ''N'',
             CARD_NUM,  INT_SUBJ_ID, SUBJ_NAME,
             CARD_STATUS, CARD_REM, STATUS_DATE, CARD_TYPE_ID,
             FLAG_LIMIT_SCHEME, ISSUE_DATE
        from (
         select /*+ DRIVING_SITE(c) NO_MERGE */      
                c.GR_NOMER CARD_NUM,  
                c.ID_VLADELTZA INT_SUBJ_ID,  f.NAME SUBJ_NAME,
                c.ID_SOSTOYANYA CARD_STATUS, TRIM(c.DERJATEL) CARD_REM,  
                case when c.ID_SOSTOYANYA in (0,1,4) then c.DATA_VYDACHI else c.DATA_IZYATIYA 
                end STATUS_DATE,
                nvl( o.ONLINE_CARDTYPE, 1) CARD_TYPE_ID,
               (select decode(count(*),0,''Y'',''N'') 
                  from '||vDbScheme||'.ECFIL015@'||vDbLink ||' b 
                 where b.ID_KARTY = c.ID_KARTY 
                   and b.ID_SCHEMY in (5,6,7)
                )  FLAG_LIMIT_SCHEME,
                coalesce((select max(h.DATA_VIDACHI) 
                            from '||vDbScheme||'.ECFIL028@'||vDbLink ||' h 
                           where h.ID_VLADELTZA   = c.ID_VLADELTZA 
                             and h.ID_KARTY       = c.ID_KARTY 
                             and h.ID_SOSTOYANIYA = 1 
                             and h.ID_PREV_STATE  = 4), c.DATA_VYDACHI) ISSUE_DATE
                   
           from '||vDbScheme||'.ECFIL012@'||vDbLink ||' c  
           left join '||vDbScheme||'.OC_ONL_CARDS@'||vDbLink ||' o on o.CARDNUM = c.GR_NOMER 
           left join '||vDbScheme||'.ECFIL002@'||vDbLink ||' f on (c.ID_VLADELTZA = f.ID_FIRMY)
          where c.ID_PRINADLEJNOSTI in (0,2)   
            and c.ID_SOSTOYANYA != 0  
       ) j';    
      execute immediate script;
      vCardCount := sql%rowcount;   
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормоза при join-е нескольких таблиц чероз DBlink / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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