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

спасибо.
еще тут почитал, скорее всего поможет
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397098
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть простой запрос к удаленной БД (в ней нельзя создавать никакие объекты)
Код: 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
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397102
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397127
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если использовать просто курсор, а не sys_refcursor ?

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

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

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

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

c clob;

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

c clob;

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

c clob;

execute immediate c;
началось
результат нужно запихнуть в локальную таблицу
было
execute immediate 'insert into TTTT () select ....';
и жутко тормозило.
хотя сам запрос выполняется быстро и в for c in loop быстро.
с execute immediate началось ...
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397268
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397269
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну печально,
здесь пишут, что работает c курсором
http://www.sqlrunning.com/?p=66
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397274
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее должно работать BULK COLLECT и FORALL INSERT (через локальную коллекцию)
Но у тебя, насколько я понял и с динамическим SQL для обычного SELECT проблемы
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397283
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты запрос-то весь показываешь?
Передача параметров там... или еще какие тонкости
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397292
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397293
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хинты DRIVING_SITE в подселектах роль не играют, пробовал и с ними и без
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397306
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запихни в execute immediate весь блок
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397307
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получилось через open c for 'select ...'
fetch c bulk collect into lomit

всем спасибо.
уж как залетает все скоро :)
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397309
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397352
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще момент.
данные вставляются в буферную таблицу
если нужно локальную фильтрацию замутить.
сделать простой перебор массива с фильтром и одиночными инсертами или forall с последующей массовой фильтрацией и удалением или отметкой в буфере.
что лучше?

склоняюсь ко второму варианту.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397356
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя если фильтр уберет существенное кол-во данных то наверное лучше до вставки не доводить даже, т.е. вариант 1
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397383
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, что с fetch хинт не влияет на план запроса , а с fetch bulk collect влияет.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397399
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня есть рабочий код (собственно для которого я давно создавал тему), где идет вставка в локальную таблицу из нескольких линкованных таблиц через 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
25 сообщений из 54, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормоза при join-е нескольких таблиц чероз DBlink
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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