powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормоза при join-е нескольких таблиц чероз DBlink
54 сообщений из 54, показаны все 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
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397403
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
также написан был и обсуждаемый запрос, но он работать отказался.
какая-то хня с этими линками, честное слово
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397724
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasу меня есть рабочий код (собственно для которого я давно создавал тему), где идет вставка в локальную таблицу из нескольких линкованных таблиц через execute immediate. без хинта висит по полчаса, с хинтом пара минут всего
хотя Вячеслав Любомудров утверждал обратное.Это не только я утверждал, но и нота "Limitations of DRIVING_SITE Hint For DMLS and DDLS (Doc ID 825677.1)"
Хотя, тут я неправ -- когда все таблицы в запросе удаленные и на одном сайте , то да, все соединения могут быть выполнены на том удаленном сайте. Это работает как для INSERT, так и для CTAS (хотя из ноты я понял обратное). Оно, кстати, и без всякого DRIVING_SITE так выполнится.

Если хоть одна таблица локальная или на разных сайтах, то все будет выполнятся на target сайте (соответственно, при любом UPDATE/DELETE/MERGE тоже) и никакой DRIVING_SITE не поможет
Код: 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.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
--
-- Все таблички удаленные на одном сайте
--
tst> explain plan for
  2  select * from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
Plan hash value: 2031298245

----------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT REMOTE|      |     1 |     4 |     7  (15)| 00:00:01 |        |
|*  1 |  HASH JOIN             |      |     1 |     4 |     7  (15)| 00:00:01 |        |
|   2 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |
|   3 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |
----------------------------------------------------------------------------------------

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

   1 - access("A2"."DUMMY"="A1"."DUMMY")

Note
-----
   - fully remote statement
   - dynamic sampling used for this statement (level=2)

20 rows selected.

tst> explain plan for
  2  insert into t2 select * from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 2014232345

----------------------------------------------------------------------
| Id  | Operation                | Name | Cost (%CPU)| Inst   |IN-OUT|
----------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |     0   (0)|        |      |
|   1 |  LOAD TABLE CONVENTIONAL | T2   |            |        |      |
|   2 |   REMOTE                 |      |            | TST_L~ | R->S |
----------------------------------------------------------------------

Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT
       "A2"."DUMMY","A1"."DUMMY" FROM "T1" "A2","T1" "A1" WHERE
       "A2"."DUMMY"="A1"."DUMMY" (accessing 'TST_LNK.FEB.RU' )


17 rows selected.

tst> explain plan for create table t3 as
  2  select a.dummy a, b.dummy b from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------
Plan hash value: 4198801308

--------------------------------------------------------------------
| Id  | Operation              | Name | Cost (%CPU)| Inst   |IN-OUT|
--------------------------------------------------------------------
|   0 | CREATE TABLE STATEMENT |      |     0   (0)|        |      |
|   1 |  LOAD AS SELECT        | T3   |            |        |      |
|   2 |   REMOTE               |      |            | TST_L~ | R->S |
--------------------------------------------------------------------

Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT
       "A2"."DUMMY","A1"."DUMMY" FROM "T1" "A2","T1" "A1" WHERE
       "A2"."DUMMY"="A1"."DUMMY" (accessing 'TST_LNK.FEB.RU' )


17 rows selected.

--
-- Все таблички удаленные на разных сайтах
--
tst> explain plan for
  2  select /*+ driving_site(b) */ * from t1@tst_lnk a, t1@tst_lnk2 b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
Plan hash value: 1661057672

-----------------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT REMOTE|      |   327 |  1308 |     6  (17)| 00:00:01 |        |      |
|*  1 |  HASH JOIN             |      |   327 |  1308 |     6  (17)| 00:00:01 |        |      |
|   2 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |      |
|   3 |   REMOTE               | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
-----------------------------------------------------------------------------------------------

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

   1 - access("A2"."DUMMY"="A1"."DUMMY")

Remote SQL Information (identified by operation id):
----------------------------------------------------

   3 - SELECT "DUMMY" FROM "T1"@TST_LNK.FEB.RU "A2" (accessing 'TST_LNK.FEB.RU' )


Note
-----
   - fully remote statement
   - dynamic sampling used for this statement (level=2)

26 rows selected.

tst> explain plan for
  2  insert into t2 select /*+ driving_site(b) */ * from t1@tst_lnk a, t1@tst_lnk2 b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
Plan hash value: 1534287080

-------------------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
-------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |   327 |  1308 |     5  (20)| 00:00:01 |        |      |
|   1 |  LOAD TABLE CONVENTIONAL | T2   |       |       |            |          |        |      |
|*  2 |   HASH JOIN              |      |   327 |  1308 |     5  (20)| 00:00:01 |        |      |
|   3 |    REMOTE                | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
|   4 |    REMOTE                | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
-------------------------------------------------------------------------------------------------

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

   2 - access("A"."DUMMY"="B"."DUMMY")

Remote SQL Information (identified by operation id):
----------------------------------------------------

   3 - SELECT /*+ OPAQUE_TRANSFORM */ "DUMMY" FROM "T1" "A" (accessing 'TST_LNK.FEB.RU' )

   4 - SELECT /*+ OPAQUE_TRANSFORM */ "DUMMY" FROM "T1" "B" (accessing 'TST_LNK2.FEB.RU'
       )


25 rows selected.
--
-- Про локальные таблички и другие операции можешь сам посмотреть
--



PS. Все твои домыслы "так работает, так почему-то не работает" звучат не убедительно. Если действительно хочешь разобраться -- включай трассировку, смотри ожидания, реальный план.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397790
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровbarrabasу меня есть рабочий код (собственно для которого я давно создавал тему), где идет вставка в локальную таблицу из нескольких линкованных таблиц через execute immediate. без хинта висит по полчаса, с хинтом пара минут всего
хотя Вячеслав Любомудров утверждал обратное.Это не только я утверждал, но и нота "Limitations of DRIVING_SITE Hint For DMLS and DDLS (Doc ID 825677.1)"
Хотя, тут я неправ -- когда все таблицы в запросе удаленные и на одном сайте , то да, все соединения могут быть выполнены на том удаленном сайте. Это работает как для INSERT, так и для CTAS (хотя из ноты я понял обратное). Оно, кстати, и без всякого DRIVING_SITE так выполнится.

Если хоть одна таблица локальная или на разных сайтах, то все будет выполнятся на target сайте (соответственно, при любом UPDATE/DELETE/MERGE тоже) и никакой DRIVING_SITE не поможет
Код: 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.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
--
-- Все таблички удаленные на одном сайте
--
tst> explain plan for
  2  select * from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
Plan hash value: 2031298245

----------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT REMOTE|      |     1 |     4 |     7  (15)| 00:00:01 |        |
|*  1 |  HASH JOIN             |      |     1 |     4 |     7  (15)| 00:00:01 |        |
|   2 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |
|   3 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |
----------------------------------------------------------------------------------------

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

   1 - access("A2"."DUMMY"="A1"."DUMMY")

Note
-----
   - fully remote statement
   - dynamic sampling used for this statement (level=2)

20 rows selected.

tst> explain plan for
  2  insert into t2 select * from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 2014232345

----------------------------------------------------------------------
| Id  | Operation                | Name | Cost (%CPU)| Inst   |IN-OUT|
----------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |     0   (0)|        |      |
|   1 |  LOAD TABLE CONVENTIONAL | T2   |            |        |      |
|   2 |   REMOTE                 |      |            | TST_L~ | R->S |
----------------------------------------------------------------------

Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT
       "A2"."DUMMY","A1"."DUMMY" FROM "T1" "A2","T1" "A1" WHERE
       "A2"."DUMMY"="A1"."DUMMY" (accessing 'TST_LNK.FEB.RU' )


17 rows selected.

tst> explain plan for create table t3 as
  2  select a.dummy a, b.dummy b from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------
Plan hash value: 4198801308

--------------------------------------------------------------------
| Id  | Operation              | Name | Cost (%CPU)| Inst   |IN-OUT|
--------------------------------------------------------------------
|   0 | CREATE TABLE STATEMENT |      |     0   (0)|        |      |
|   1 |  LOAD AS SELECT        | T3   |            |        |      |
|   2 |   REMOTE               |      |            | TST_L~ | R->S |
--------------------------------------------------------------------

Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT
       "A2"."DUMMY","A1"."DUMMY" FROM "T1" "A2","T1" "A1" WHERE
       "A2"."DUMMY"="A1"."DUMMY" (accessing 'TST_LNK.FEB.RU' )


17 rows selected.

--
-- Все таблички удаленные на разных сайтах
--
tst> explain plan for
  2  select /*+ driving_site(b) */ * from t1@tst_lnk a, t1@tst_lnk2 b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
Plan hash value: 1661057672

-----------------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT REMOTE|      |   327 |  1308 |     6  (17)| 00:00:01 |        |      |
|*  1 |  HASH JOIN             |      |   327 |  1308 |     6  (17)| 00:00:01 |        |      |
|   2 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |      |
|   3 |   REMOTE               | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
-----------------------------------------------------------------------------------------------

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

   1 - access("A2"."DUMMY"="A1"."DUMMY")

Remote SQL Information (identified by operation id):
----------------------------------------------------

   3 - SELECT "DUMMY" FROM "T1"@TST_LNK.FEB.RU "A2" (accessing 'TST_LNK.FEB.RU' )


Note
-----
   - fully remote statement
   - dynamic sampling used for this statement (level=2)

26 rows selected.

tst> explain plan for
  2  insert into t2 select /*+ driving_site(b) */ * from t1@tst_lnk a, t1@tst_lnk2 b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
Plan hash value: 1534287080

-------------------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
-------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |   327 |  1308 |     5  (20)| 00:00:01 |        |      |
|   1 |  LOAD TABLE CONVENTIONAL | T2   |       |       |            |          |        |      |
|*  2 |   HASH JOIN              |      |   327 |  1308 |     5  (20)| 00:00:01 |        |      |
|   3 |    REMOTE                | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
|   4 |    REMOTE                | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
-------------------------------------------------------------------------------------------------

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

   2 - access("A"."DUMMY"="B"."DUMMY")

Remote SQL Information (identified by operation id):
----------------------------------------------------

   3 - SELECT /*+ OPAQUE_TRANSFORM */ "DUMMY" FROM "T1" "A" (accessing 'TST_LNK.FEB.RU' )

   4 - SELECT /*+ OPAQUE_TRANSFORM */ "DUMMY" FROM "T1" "B" (accessing 'TST_LNK2.FEB.RU'
       )


25 rows selected.
--
-- Про локальные таблички и другие операции можешь сам посмотреть
--



PS. Все твои домыслы "так работает, так почему-то не работает" звучат не убедительно. Если действительно хочешь разобраться -- включай трассировку, смотри ожидания, реальный план.


Вячеслав Любомудровbarrabasу меня есть рабочий код (собственно для которого я давно создавал тему), где идет вставка в локальную таблицу из нескольких линкованных таблиц через execute immediate. без хинта висит по полчаса, с хинтом пара минут всего
хотя Вячеслав Любомудров утверждал обратное.Это не только я утверждал, но и нота "Limitations of DRIVING_SITE Hint For DMLS and DDLS (Doc ID 825677.1)"
Хотя, тут я неправ -- когда все таблицы в запросе удаленные и на одном сайте , то да, все соединения могут быть выполнены на том удаленном сайте. Это работает как для INSERT, так и для CTAS (хотя из ноты я понял обратное). Оно, кстати, и без всякого DRIVING_SITE так выполнится.

Если хоть одна таблица локальная или на разных сайтах, то все будет выполнятся на target сайте (соответственно, при любом UPDATE/DELETE/MERGE тоже) и никакой DRIVING_SITE не поможет
Код: 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.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
--
-- Все таблички удаленные на одном сайте
--
tst> explain plan for
  2  select * from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
Plan hash value: 2031298245

----------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT REMOTE|      |     1 |     4 |     7  (15)| 00:00:01 |        |
|*  1 |  HASH JOIN             |      |     1 |     4 |     7  (15)| 00:00:01 |        |
|   2 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |
|   3 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |
----------------------------------------------------------------------------------------

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

   1 - access("A2"."DUMMY"="A1"."DUMMY")

Note
-----
   - fully remote statement
   - dynamic sampling used for this statement (level=2)

20 rows selected.

tst> explain plan for
  2  insert into t2 select * from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 2014232345

----------------------------------------------------------------------
| Id  | Operation                | Name | Cost (%CPU)| Inst   |IN-OUT|
----------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |     0   (0)|        |      |
|   1 |  LOAD TABLE CONVENTIONAL | T2   |            |        |      |
|   2 |   REMOTE                 |      |            | TST_L~ | R->S |
----------------------------------------------------------------------

Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT
       "A2"."DUMMY","A1"."DUMMY" FROM "T1" "A2","T1" "A1" WHERE
       "A2"."DUMMY"="A1"."DUMMY" (accessing 'TST_LNK.FEB.RU' )


17 rows selected.

tst> explain plan for create table t3 as
  2  select a.dummy a, b.dummy b from t1@tst_lnk a, t1@tst_lnk b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------------
Plan hash value: 4198801308

--------------------------------------------------------------------
| Id  | Operation              | Name | Cost (%CPU)| Inst   |IN-OUT|
--------------------------------------------------------------------
|   0 | CREATE TABLE STATEMENT |      |     0   (0)|        |      |
|   1 |  LOAD AS SELECT        | T3   |            |        |      |
|   2 |   REMOTE               |      |            | TST_L~ | R->S |
--------------------------------------------------------------------

Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT
       "A2"."DUMMY","A1"."DUMMY" FROM "T1" "A2","T1" "A1" WHERE
       "A2"."DUMMY"="A1"."DUMMY" (accessing 'TST_LNK.FEB.RU' )


17 rows selected.

--
-- Все таблички удаленные на разных сайтах
--
tst> explain plan for
  2  select /*+ driving_site(b) */ * from t1@tst_lnk a, t1@tst_lnk2 b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------
Plan hash value: 1661057672

-----------------------------------------------------------------------------------------------
| Id  | Operation              | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT REMOTE|      |   327 |  1308 |     6  (17)| 00:00:01 |        |      |
|*  1 |  HASH JOIN             |      |   327 |  1308 |     6  (17)| 00:00:01 |        |      |
|   2 |   TABLE ACCESS FULL    | T1   |     1 |     2 |     3   (0)| 00:00:01 |    TST |      |
|   3 |   REMOTE               | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
-----------------------------------------------------------------------------------------------

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

   1 - access("A2"."DUMMY"="A1"."DUMMY")

Remote SQL Information (identified by operation id):
----------------------------------------------------

   3 - SELECT "DUMMY" FROM "T1"@TST_LNK.FEB.RU "A2" (accessing 'TST_LNK.FEB.RU' )


Note
-----
   - fully remote statement
   - dynamic sampling used for this statement (level=2)

26 rows selected.

tst> explain plan for
  2  insert into t2 select /*+ driving_site(b) */ * from t1@tst_lnk a, t1@tst_lnk2 b where a.dummy=b.dummy;

Explained.

tst> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------
Plan hash value: 1534287080

-------------------------------------------------------------------------------------------------
| Id  | Operation                | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
-------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |      |   327 |  1308 |     5  (20)| 00:00:01 |        |      |
|   1 |  LOAD TABLE CONVENTIONAL | T2   |       |       |            |          |        |      |
|*  2 |   HASH JOIN              |      |   327 |  1308 |     5  (20)| 00:00:01 |        |      |
|   3 |    REMOTE                | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
|   4 |    REMOTE                | T1   |   327 |   654 |     2   (0)| 00:00:01 | TST_L~ | R->S |
-------------------------------------------------------------------------------------------------

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

   2 - access("A"."DUMMY"="B"."DUMMY")

Remote SQL Information (identified by operation id):
----------------------------------------------------

   3 - SELECT /*+ OPAQUE_TRANSFORM */ "DUMMY" FROM "T1" "A" (accessing 'TST_LNK.FEB.RU' )

   4 - SELECT /*+ OPAQUE_TRANSFORM */ "DUMMY" FROM "T1" "B" (accessing 'TST_LNK2.FEB.RU'
       )


25 rows selected.
--
-- Про локальные таблички и другие операции можешь сам посмотреть
--



PS. Все твои домыслы "так работает, так почему-то не работает" звучат не убедительно. Если действительно хочешь разобраться -- включай трассировку, смотри ожидания, реальный план.

да, на самом деле для получения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
---------------------------------------------------------------------------------------
| Id | Operation                 | Name         | Rows   | Bytes    | Cost | Time     |
---------------------------------------------------------------------------------------
|  0 | INSERT STATEMENT          |              | 160975 | 37185225 | 4144 | 00:00:50 |
|  1 |   LOAD TABLE CONVENTIONAL | BUF_CARD     |        |          |      |          |
|  2 |    SEQUENCE               | SEQ_BUF_CARD |        |          |      |          |
|  3 |     VIEW                  |              | 160975 | 37185225 | 4144 | 00:00:50 |
|  4 |      REMOTE               |              |        |          |      |          |
---------------------------------------------------------------------------------------

достаточно было NO_MERGE, DRIVING_SITE не влиял никак

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      select 
             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 /*+  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,  
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397791
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без хинта NO_MERGE и при любых вариациях DRIVING_SITE

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
----------------------------------------------------------------------------------------
| Id  | Operation                 | Name         | Rows   | Bytes    | Cost | Time     |
----------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT          |              | 160975 | 44912025 | 4144 | 00:00:50 |
|   1 |   LOAD TABLE CONVENTIONAL | BUF_CARD     |        |          |      |          |
|   2 |    SORT AGGREGATE         |              |      1 |       26 |      |          |
|   3 |     REMOTE                | ECFIL015     |      3 |       78 |    4 | 00:00:01 |
|   4 |    SORT AGGREGATE         |              |      1 |       51 |      |          |
|   5 |     REMOTE                | ECFIL028     |      1 |       51 |    4 | 00:00:01 |
|   6 |    SEQUENCE               | SEQ_BUF_CARD |        |          |      |          |
| * 7 |     HASH JOIN RIGHT OUTER |              | 160975 | 44912025 | 4144 | 00:00:50 |
|   8 |      REMOTE               | ECFIL002     |  10689 |   801675 |   86 | 00:00:02 |
|   9 |      REMOTE               |              | 160975 | 28653550 | 1615 | 00:00:20 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 7 - access("C"."ID_VLADELTZA"="F"."ID_FIRMY"(+))
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397797
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудров,

Не работал пример с курсором . По времени выполнения и без плана было понятно , что хинт не пользовался. В этом загвоздка.
Хотя бы угадать, как оптимизатор обрабатывает запрос с удаленными таблицам с применением pl/sql типов.
А вы делаете теоретические выкладки.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397799
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но почему план чисто в SQL, в plsql блоках for c in (select ...) и в open c for 'select ' разный я так и не понял.
еще и при разных способах фетча (с bulk collect и без)
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39397808
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnetИнтересно, что с fetch хинт не влияет на план запроса , а с fetch bulk collect влияет.
кстати, такое ощущение что хин не работает вообще.
с fetch bulk collect работает 2 секунды что с хинтом что без.
а простой фетч висит 15 минут, так-же на хинт не обращая внимания.
записей всего 8000 в результате получаю, т.е. это не то чтобы долгая построчная выборка
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398295
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще наблюдение
переписываю на forall загрузку транзакций из внешней системы
в ней дата хранится как дата без времени и в отдельном поле время в виде кол-ва секунд в дне
если фетчить получать поля по отдельности - все ок
если написать в запросе t.DATA + t.VREMYA/86400 OPER_DATE, чтобы получить дату со временем сразу, план ломается и все старания летят к чертям.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398549
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnetНе работал пример с курсором . По времени выполнения и без плана было понятно , что хинт не пользовался. В этом загвоздка.
Хотя бы угадать, как оптимизатор обрабатывает запрос с удаленными таблицам с применением pl/sql типов.
А вы делаете теоретические выкладки.Если ты не знаешь, как это работает (должно работать), то метаться методом тыка можно долго.
Например, некоторые вещи работать просто не будут, они так устроены (тот же DRIVING_SITE)
А если не работает то, что по всем прикидкам должно работать, то нужно и подходить более серьезно -- делать трассировку, смотреть планы, ожидания. А не метаться со всякими "давай попробуем так, а еще так" и делать глубокомысленные выводы из обрывков информации, неизвестно когда и на каких данных полученной
Это если, конечно, интересен результат, а не процесс

PS. Это, конечно, больше к ТС. Остальным, собственно, пофиг, какие давать советы, можно и "пометаться" и "выводы поделать"
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398579
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровPS. Это, конечно, больше к ТС. Остальным, собственно, пофиг, какие давать советы, можно и "пометаться" и "выводы поделать" Зато можно почувствовать себя "мега -исследователем", несмотря на переливание из пустого в порожнее.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398627
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВячеслав ЛюбомудровPS. Это, конечно, больше к ТС. Остальным, собственно, пофиг, какие давать советы, можно и "пометаться" и "выводы поделать" Зато можно почувствовать себя "мега -исследователем", несмотря на переливание из пустого в порожнее.Если это про меня, то да, мне интересно "поисследовать" что-то, с чем мне не приходится (часто) сталкиваться
Ну и записать, ибо так оно лучше запоминается. Ну не писать же в свой блокнотик, его же никто не прочитает, чтож я, зря старался?
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398637
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровЕсли это про меняНет, конечно же.
Вячеслав Любомудровчтож я, зря старался?И истинных исследователей это основной результат.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398641
Фотография 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.
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.
select 
                t.TRN_GUID                                    EXT_OPER_GUID,
                t.DATA                                      EXT_DATE,
                t.VREMYA                                     EXT_TIME_SEC,
                t.ID_PRINADL                                 EXT_SUBJ_TYPE_ID,
                t.ID_KLIENTA                                 ID_KLIENTA,
                s.ID_KLIENTA_IMPORTA                         ID_KLIENTA_IMPORTA,
                t.ID_PRICHINY                                OPER_REASON,
                t.OPERATZIYA                                 OPER_OPER,
                t.ID_KOSH_ZA_CHTO                            EXT_GOODS_ID,
                t.ID_KOSH_SCHEM                              EXT_PAY_GOODS_ID,             
                (select c.ID_KOSHELKA from XXX.ECFIL061@XXX c
                  where c.ID_EMITENTA = t.EM_GDE_OBSL and c.ID_PRIVYAZKI_LOCAL = t.ID_KOSH_ZA_CHTO) PP_LOCAL_GOODS_ID, 
                (select c.ID_PRIVYAZKI_GLOB from  XXX.ECFIL061@XXX c
                  where c.ID_EMITENTA = y.ID_EMITENT and c.ID_KOSHELKA = t.ID_KOSH_ZA_CHTO) PP_GLOBAL_GOODS_ID,
                t.SUMMA_ZA_CHTO                              SUMMA_ZA_CHTO,
                t.SUMMA_CHEM_REALNO                          SUMMA_CHEM_REALNO,
                t.BASE_DELTA_PRICE                           BASE_DELTA_PRICE,
                t.BASE_DELTA_SUM                             BASE_DELTA_SUM,   
                t.TZENA_TERMINALA                            TZENA_TERMINALA, 
                t.TZENA_PERESCHETA                           TZENA_PERESCHETA,
                t.NOMER_SCHEMY                               NOMER_SCHEMY,
                XXX.Get_Price@XXX(TZENA_TERMINALA, TZENA_PERESCHETA, NOMER_SCHEMY) GET_PRICE_VALUE,
                t.GR_NOMER                                   CARD_NUM_GRAPH,
                t.EM_GDE_OBSL                                TERM_ISS_NUM,
                t.NOMER_TERMINALA                            TERM_NUM,
                t.FILIAL_WHERE                               TERM_FILIAL,
                t.ID_TO                                      EXT_POS_ID,
                l.NAZVANIE                                   EXT_POS_NAME,
                l.ADRES                                      EXT_POS_ADDRESS,
                t.GR_NOMER_KARTY_OPER                        OP_CARD_NUM_GRAPH,
                case
                   when t.ID_PRICHINY in (50,60) then
                       (select to_char(i.ID_GR_OP)||'.'||to_char(i.NOMER_V_GRUPPE)
                          from XXX.ECFIL148@XXX i
                         where i.GUID_GENERATED = t.TRN_GUID
                        )
                   when t.ID_PRICHINY in (51,61) then
                       (select to_char(i.ID_GR_OP)||'.'||to_char(i.NOMER_V_GRUPPE)
                          from XXX.ECFIL148@XXX i
                         where i.DATA_OBSL = t.DATA and i.VREMYA_OBSL = t.VREMYA
                           and i.GUID_RETURNED = t.TRN_GUID
                        )
                   when t.ID_PRICHINY in (52,62) then
                       (select to_char(i.ID_GR_OP)||'.'||to_char(i.NOMER_V_GRUPPE)
                          from XXX.ECFIL148@XXX i
                         where i.DATA_OBSL = t.DATA and i.VREMYA_OBSL = t.VREMYA
                           and i.GUID_REALIZED = t.TRN_GUID
                        )
                   else null
                end                                          OPER_GROUP_CODE,
                u.MANAGER_ID                                 EXT_MANAGER_CODE
           from XXX.P5CONFIG@XXX y,  XXX.ECFIL139@XXX t, 
                (select ID_FIRMY, 2 ID_PRINADL, MANAGER_ID from XXX.ECFIL002@XXX) u, 
                XXX.ECFIL108@XXX s,
                XXX.ECFIL037@XXX l
          where 1=1  and t.DATA = sysdate and t.DATA = sysdate - 1  and t.ID_KLIENTA = s.ID_NASHEGO_KLIENTA (+)
            and t.ID_PRINADL = s.ID_PRINADLEJNOSTI (+)
            and t.ID_KLIENTA = u.ID_FIRMY (+)
            and t.ID_PRINADL = u.ID_PRINADL (+)                  
            and t.ID_TO = l.ID_TOCHKI_OBSLUGIVANIYA (+)
            and t.EM_GDE_OBSL = l.ID_EMITENT (+)
            and t.FILIAL_WHERE = l.ID_FILIALA (+)


даёт нужный
Код: plaintext
1.
2.
3.
4.
5.
6.
--------------------------------------------------------------
| Id  | Operation        | Name | Cost (%CPU)| Inst   |IN-OUT|
--------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     0   (0)|        |      |
|   1 |  REMOTE          |      |            | MAG25~ | R->S |
--------------------------------------------------------------

а если напишу t.DATA + VREMYA/86400, чтобы получить дату и время в одном поле

Код: 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.
select 
                t.TRN_GUID                                    EXT_OPER_GUID,
[color=red]                t.DATA + VREMYA/86400                         OPER_DATE,[/color]
                t.ID_PRINADL                                 EXT_SUBJ_TYPE_ID,
                t.ID_KLIENTA                                 ID_KLIENTA,
                s.ID_KLIENTA_IMPORTA                         ID_KLIENTA_IMPORTA,
                t.ID_PRICHINY                                OPER_REASON,
                t.OPERATZIYA                                 OPER_OPER,
                t.ID_KOSH_ZA_CHTO                            EXT_GOODS_ID,
                t.ID_KOSH_SCHEM                              EXT_PAY_GOODS_ID,             
                (select c.ID_KOSHELKA from XXX.ECFIL061@XXX c
                  where c.ID_EMITENTA = t.EM_GDE_OBSL and c.ID_PRIVYAZKI_LOCAL = t.ID_KOSH_ZA_CHTO) PP_LOCAL_GOODS_ID, 
                (select c.ID_PRIVYAZKI_GLOB from  XXX.ECFIL061@XXX c
                  where c.ID_EMITENTA = y.ID_EMITENT and c.ID_KOSHELKA = t.ID_KOSH_ZA_CHTO) PP_GLOBAL_GOODS_ID,
                t.SUMMA_ZA_CHTO                              SUMMA_ZA_CHTO,
                t.SUMMA_CHEM_REALNO                          SUMMA_CHEM_REALNO,
                t.BASE_DELTA_PRICE                           BASE_DELTA_PRICE,
                t.BASE_DELTA_SUM                             BASE_DELTA_SUM,   
                t.TZENA_TERMINALA                            TZENA_TERMINALA, 
                t.TZENA_PERESCHETA                           TZENA_PERESCHETA,
                t.NOMER_SCHEMY                               NOMER_SCHEMY,
                XXX.Get_Price@XXX(TZENA_TERMINALA, TZENA_PERESCHETA, NOMER_SCHEMY) GET_PRICE_VALUE,
                t.GR_NOMER                                   CARD_NUM_GRAPH,
                t.EM_GDE_OBSL                                TERM_ISS_NUM,
                t.NOMER_TERMINALA                            TERM_NUM,
                t.FILIAL_WHERE                               TERM_FILIAL,
                t.ID_TO                                      EXT_POS_ID,
                l.NAZVANIE                                   EXT_POS_NAME,
                l.ADRES                                      EXT_POS_ADDRESS,
                t.GR_NOMER_KARTY_OPER                        OP_CARD_NUM_GRAPH,
                case
                   when t.ID_PRICHINY in (50,60) then
                       (select to_char(i.ID_GR_OP)||'.'||to_char(i.NOMER_V_GRUPPE)
                          from XXX.ECFIL148@XXX i
                         where i.GUID_GENERATED = t.TRN_GUID
                        )
                   when t.ID_PRICHINY in (51,61) then
                       (select to_char(i.ID_GR_OP)||'.'||to_char(i.NOMER_V_GRUPPE)
                          from XXX.ECFIL148@XXX i
                         where i.DATA_OBSL = t.DATA and i.VREMYA_OBSL = t.VREMYA
                           and i.GUID_RETURNED = t.TRN_GUID
                        )
                   when t.ID_PRICHINY in (52,62) then
                       (select to_char(i.ID_GR_OP)||'.'||to_char(i.NOMER_V_GRUPPE)
                          from XXX.ECFIL148@XXX i
                         where i.DATA_OBSL = t.DATA and i.VREMYA_OBSL = t.VREMYA
                           and i.GUID_REALIZED = t.TRN_GUID
                        )
                   else null
                end                                          OPER_GROUP_CODE,
                u.MANAGER_ID                                 EXT_MANAGER_CODE
           from XXX.P5CONFIG@XXX y,  XXX.ECFIL139@XXX t, 
                (select ID_FIRMY, 2 ID_PRINADL, MANAGER_ID from XXX.ECFIL002@XXX) u, 
                XXX.ECFIL108@XXX s,
                XXX.ECFIL037@XXX l
          where 1=1  and t.DATA = sysdate and t.DATA = sysdate - 1  and t.ID_KLIENTA = s.ID_NASHEGO_KLIENTA (+)
            and t.ID_PRINADL = s.ID_PRINADLEJNOSTI (+)
            and t.ID_KLIENTA = u.ID_FIRMY (+)
            and t.ID_PRINADL = u.ID_PRINADL (+)                  
            and t.ID_TO = l.ID_TOCHKI_OBSLUGIVANIYA (+)
            and t.EM_GDE_OBSL = l.ID_EMITENT (+)
            and t.FILIAL_WHERE = l.ID_FILIALA (+)


получу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
--------------------------------------------------------------------------------------------------
| Id  | Operation                | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Inst   |IN-OUT|
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |          | 12580 |  4963K|       |  1263   (1)|        |      |
|   1 |  REMOTE                  | ECFIL061 |     1 |    12 |       |     3   (0)| MAG25~ | R->S |
|   2 |  REMOTE                  | ECFIL061 |     1 |    12 |       |     2   (0)| MAG25~ | R->S |
|   3 |  REMOTE                  | ECFIL148 |     2 |    88 |       |     4   (0)| MAG25~ | R->S |
|   4 |  REMOTE                  | ECFIL148 |     1 |    66 |       |     4   (0)| MAG25~ | R->S |
|   5 |  REMOTE                  | ECFIL148 |     1 |    66 |       |     4   (0)| MAG25~ | R->S |
|   6 |  FILTER                  |          |       |       |       |            |        |      |
|   7 |   HASH JOIN RIGHT OUTER  |          | 12580 |  4963K|       |  1263   (1)|        |      |
|   8 |    VIEW                  |          | 10689 |   302K|       |    87   (2)|        |      |
|   9 |     REMOTE               | ECFIL002 | 10689 |   271K|       |    87   (2)| MAG25~ | R->S |
|  10 |    HASH JOIN RIGHT OUTER |          | 12580 |  4606K|       |  1177   (1)|        |      |
|  11 |     REMOTE               | ECFIL108 |  9903 | 99030 |       |     8   (0)| MAG25~ | R->S |
|  12 |     HASH JOIN OUTER      |          | 12580 |  4484K|  3416K|  1168   (1)|        |      |
|  13 |      MERGE JOIN CARTESIAN|          | 12580 |  3267K|       |   733  (27)|        |      |
|  14 |       REMOTE             | P5CONFIG |     1 |    13 |       |     5   (0)| MAG25~ | R->S |
|  15 |       BUFFER SORT        |          | 12580 |  3108K|       |   728  (27)|        |      |
|  16 |        REMOTE            | ECFIL139 | 12580 |  3108K|       |   534   (0)| MAG25~ | R->S |
|  17 |      REMOTE              | ECFIL037 | 54316 |  5251K|       |   177   (1)| MAG25~ | R->S |
--------------------------------------------------------------------------------------------------


что с того что я узнаю что план строится неправильный при простом fetch, а не fetch bulk collect на одном запросе? я и так по времени что неправильно работает. как трассировка бы помогла выбрать именно fetch bulk collect ?
как она помогла бы с t.DATA + VREMYA/86400?
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398644
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет ли переменной с именем VREMYA ?
Ну и возможно стоит переходить на 10053 -- сам я в этом не силен, но иногда удается понять почему был выбран именно такой план
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398645
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот и приходится перебирать варианты и искать тормозные куски в запросе постепенно подключая их
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398646
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНет ли переменной с именем VREMYA ?
Ну и возможно стоит переходить на 10053 -- сам я в этом не силен, но иногда удается понять почему был выбран именно такой план
нет. я транслитом переменные не называю :)
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398647
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо перебирать, надо постараться понять -- почему
Для этого есть инструменты и надо научиться ими пользоваться
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398648
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10053?
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398649
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНе надо перебирать, надо постараться понять -- почему
Для этого есть инструменты и надо научиться ими пользоваться

ну с t.DATA + t.VREMYA/86400 как понять то?
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398651
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasВячеслав ЛюбомудровНет ли переменной с именем VREMYA ?
Ну и возможно стоит переходить на 10053 -- сам я в этом не силен, но иногда удается понять почему был выбран именно такой план
нет. я транслитом переменные не называю :)
там реально было t.DATA + t.VREMYA/86400 конечно. это уже в сейчас скопировал неудачно. план это не меняет
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398652
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasну с t.DATA + t.VREMYA/86400 как понять то?Ну тут просто - оторвать горе-архитектору ногти по самые уши.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398653
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще такие "метания", как разные, например, NLS_* настройки у текущей сессии и сессии по db-линку (на мой взгляд, это может повлиять на всякие сортировки/группировки)
Опять же, локальные переменные, передаваемые как бинды -- возможно, не всегда их можно передать
В общем, если 10046 кажет явно неожиданный план и его не удается хинтами отправить выполняться на удаленный узел (к моему стыду, я не сильно вчитывался в твои листинги и не понял, что все [не]выполняется на одном удаленном узле), то наверное, есть смысл подключать тяжелую артилерию в виде 10053
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39398654
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicbarrabasну с t.DATA + t.VREMYA/86400 как понять то?Ну тут просто - оторвать горе-архитектору ногти по самые уши.
это внешняя система данная нам в ощущениях


а пот мегаинформативный трейс
Код: plaintext
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.
PARSE #1331077304:c=0,e=66717,p=0,cr=0,cu=2,mis=0,r=0,dep=0,og=1,plh=4204221517,tim=6659453107384
EXEC #1331077304:c=0,e=329,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=4204221517,tim=6659453108216
FETCH #1331077304:c=0,e=14,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=4204221517,tim=6659453110210
STAT #1331077304 id=1 cnt=0 pid=0 pos=1 obj=0 op='REMOTE  ECFIL061 (cr=0 pr=0 pw=0 time=0 us cost=3 size=12 card=1)'
STAT #1331077304 id=2 cnt=0 pid=0 pos=2 obj=0 op='REMOTE  ECFIL061 (cr=0 pr=0 pw=0 time=0 us cost=2 size=12 card=1)'
STAT #1331077304 id=3 cnt=0 pid=0 pos=3 obj=0 op='REMOTE  ECFIL148 (cr=0 pr=0 pw=0 time=0 us cost=4 size=88 card=2)'
STAT #1331077304 id=4 cnt=0 pid=0 pos=4 obj=0 op='REMOTE  ECFIL148 (cr=0 pr=0 pw=0 time=0 us cost=4 size=66 card=1)'
STAT #1331077304 id=5 cnt=0 pid=0 pos=5 obj=0 op='REMOTE  ECFIL148 (cr=0 pr=0 pw=0 time=0 us cost=4 size=66 card=1)'
STAT #1331077304 id=6 cnt=0 pid=0 pos=6 obj=0 op='FILTER  (cr=0 pr=0 pw=0 time=6 us)'
STAT #1331077304 id=7 cnt=0 pid=6 pos=1 obj=0 op='HASH JOIN RIGHT OUTER (cr=0 pr=0 pw=0 time=0 us cost=1263 size=5081916 card=12579)'
STAT #1331077304 id=8 cnt=0 pid=7 pos=1 obj=0 op='VIEW  (cr=0 pr=0 pw=0 time=0 us cost=87 size=309981 card=10689)'
STAT #1331077304 id=9 cnt=0 pid=8 pos=1 obj=0 op='REMOTE  ECFIL002 (cr=0 pr=0 pw=0 time=0 us cost=87 size=277914 card=10689)'
STAT #1331077304 id=10 cnt=0 pid=7 pos=2 obj=0 op='HASH JOIN RIGHT OUTER (cr=0 pr=0 pw=0 time=0 us cost=1177 size=4717125 card=12579)'
STAT #1331077304 id=11 cnt=0 pid=10 pos=1 obj=0 op='REMOTE  ECFIL108 (cr=0 pr=0 pw=0 time=0 us cost=8 size=99030 card=9903)'
STAT #1331077304 id=12 cnt=0 pid=10 pos=2 obj=0 op='HASH JOIN OUTER (cr=0 pr=0 pw=0 time=0 us cost=1168 size=4591335 card=12579)'
STAT #1331077304 id=13 cnt=0 pid=12 pos=1 obj=0 op='MERGE JOIN CARTESIAN (cr=0 pr=0 pw=0 time=0 us cost=733 size=3346014 card=12579)'
STAT #1331077304 id=14 cnt=0 pid=13 pos=1 obj=0 op='REMOTE  P5CONFIG (cr=0 pr=0 pw=0 time=0 us cost=5 size=13 card=1)'
STAT #1331077304 id=15 cnt=0 pid=13 pos=2 obj=0 op='BUFFER SORT (cr=0 pr=0 pw=0 time=0 us cost=728 size=3182487 card=12579)'
STAT #1331077304 id=16 cnt=0 pid=15 pos=1 obj=0 op='REMOTE  ECFIL139 (cr=0 pr=0 pw=0 time=0 us cost=534 size=3182487 card=12579)'
STAT #1331077304 id=17 cnt=0 pid=12 pos=2 obj=0 op='REMOTE  ECFIL037 (cr=0 pr=0 pw=0 time=0 us cost=177 size=5377284 card=54316)'
CLOSE #1331077304:c=0,e=11,dep=0,type=1,tim=6659453159088
=====================
PARSING IN CURSOR #1331166304 len=46 dep=0 uid=31 oct=3 lid=31 tim=6659453160661 hv=3284879970 ad='36af17088' sqlid='bjw0tsz1wqkm2'
SELECT * FROM PETROL5_257_1.P5CONFIG@MAG25701
END OF STMT
PARSE #1331166304:c=0,e=1510,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=6659453160661
CLOSE #1331166304:c=0,e=16,dep=0,type=0,tim=6659453269727
PARSE #1271407240:c=0,e=29,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=6659453269859
EXEC #1271407240:c=0,e=100,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=6659453269988
CLOSE #1271407240:c=0,e=19,dep=0,type=3,tim=6659453272436
XCTEND rlbk=1, rd_only=1, tim=6659453272511
PARSE #1271407240:c=0,e=19,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=6659453288689
EXEC #1271407240:c=0,e=51,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=6659453288790
CLOSE #1271407240:c=0,e=31,dep=0,type=3,tim=6659453411971
PARSE #1331159904:c=0,e=40,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=6659453412124
EXEC #1331159904:c=15601,e=142,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=6659453412303
CLOSE #1331159904:c=0,e=11,dep=0,type=3,tim=6659453419733
PARSE #1271407240:c=0,e=18,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=6659453419783
EXEC #1271407240:c=0,e=49,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=6659453419855

*** 2017-02-04 16:38:49.239
CLOSE #1271407240:c=0,e=25,dep=0,type=3,tim=6659462714405
PARSE #1331306096:c=0,e=28,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=1388734953,tim=6659462714525
EXEC #1331306096:c=0,e=19,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=1388734953,tim=6659462714568
FETCH #1331306096:c=0,e=12,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=1388734953,tim=6659462716176
CLOSE #1331306096:c=0,e=5,dep=0,type=3,tim=6659462717609
PARSE #1271407240:c=0,e=22,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=6659462717660
EXEC #1271407240:c=0,e=80,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,plh=0,tim=6659462717767

...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39399268
fortnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровfortnetНе работал пример с курсором . По времени выполнения и без плана было понятно , что хинт не пользовался. В этом загвоздка.
Хотя бы угадать, как оптимизатор обрабатывает запрос с удаленными таблицам с применением pl/sql типов.
А вы делаете теоретические выкладки.Если ты не знаешь, как это работает (должно работать), то метаться методом тыка можно долго.
Например, некоторые вещи работать просто не будут, они так устроены (тот же DRIVING_SITE)
А если не работает то, что по всем прикидкам должно работать, то нужно и подходить более серьезно -- делать трассировку, смотреть планы, ожидания. А не метаться со всякими "давай попробуем так, а еще так" и делать глубокомысленные выводы из обрывков информации, неизвестно когда и на каких данных полученной
Это если, конечно, интересен результат, а не процесс

PS. Это, конечно, больше к ТС. Остальным, собственно, пофиг, какие давать советы, можно и "пометаться" и "выводы поделать"

Ну, не так уж и долго продолжалось метание...
А интересные вопросы почему игнорируете, все поучаете только.

barrabas но почему план чисто в SQL, в plsql блоках for c in (select ...) и в open c for 'select ' разный я так и не понял.
еще и при разных способах фетча (с bulk collect и без)
кстати, такое ощущение что хин не работает вообще.
с fetch bulk collect работает 2 секунды что с хинтом что без.
а простой фетч висит 15 минут, так-же на хинт не обращая внимания.
записей всего 8000 в результате получаю, т.е. это не то чтобы долгая построчная выборка
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39399326
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortnetвсе поучаете только.Да ни в коем разе
Стараюсь просто отбросить заведомо неработоспособные варианты и формализовать доступность возможных
И потом кто сказал, что это твоя записная книжка -- это моя fortnetВячеслав Любомудров...
А интересные вопросы почему игнорируетеДа если бы я сам знал, неужели бы молчал? Обязательно бы по-"поучал"
Пока предположения -- разные версии, разное окружение (NLS), разная цель запроса -- для одной строки лучше FIRST_ROWS, для BULK -- ALL_ROWS (не уверен, что сейчас оптимизатор что-то меняет, в 8-ке, вроде было такое), ошибка в статистике, какие-то трансформации -- причину выбора конкретного плана можно увидеть в 10053, но его надо уметь читать (я не умею, вот и молчу)

PS. По-последнему запросу ТС очень похоже, что он нас либо троллит, либо что-то слишком скрывает (where 1=1 and t.DATA = sysdate and t.DATA = sysdate - 1)
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39400883
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровPS. По-последнему запросу ТС очень похоже, что он нас либо троллит, либо что-то слишком скрывает (where 1=1 and t.DATA = sysdate and t.DATA = sysdate - 1)

нет, не тролю, все планы запросов реальны и тексты
последний же вопрос касался, не булкколлекта, а изменения плана при действии со столбцами. я взял запросы из процедуры, подставил вместо биндинга переменноых sysdate, получил план запроса с + t.VREMYA/86400 и без.

1=1 - пишу часто когда отлаживанию, чтобы удобнее было закомментировать первое условие и не убирать анд у второго, часто на автомате добавляю уже. на план не влияет, проверил.
t.DATA = sysdate and t.DATA = sysdate - 1 т.к. проверял сам запрос на время выполнения по дню, топом построил по нему план и планы честно выложил.
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39400889
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот то что при bulk collect оптимизатор может применять всегда план удобный для ALL_ROWS - согласен.
но не понятно почему
for c in (select ) - работает с "правильным" планом (с первой страницы),
open c for 'select'; или open CURSOR; fetch - работает с "плохим" планом. я не понимаю
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39400894
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrabasвот то что при bulk collect оптимизатор может применять всегда план удобный для ALL_ROWS - согласен.
но не понятно почему
for c in (select ) - работает с "правильным" планом (с первой страницы),
open c for 'select'; или open CURSOR; fetch - работает с "плохим" планом. я не понимаю
а главное как выяснить какую конструкцию применять для получения правильного плана, я не понял.
мне же в упрек ставили что я попробовал все варианты, а можно было как-то сразу догадаться видимо
...
Рейтинг: 0 / 0
Тормоза при join-е нескольких таблиц чероз DBlink
    #39400911
Фотография barrabas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но реально ребята помогли.
я переписал древние загрузки (которые лет 10 никто не трогал, но за это время объем данных вырос на пару порядков) с динамического execute immediate 'insert into BUF select ...' на динамеческий open c for 'select '; fetch bulk collect + forall insert

если на 500-700тыс.записей вставка в буфер была по 35-40 минут, теперь 3-4 минуты.
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Тормоза при join-е нескольких таблиц чероз DBlink
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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