Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как задать план оптимизации при работе с удал. базой  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
Доброго дня господа !

Локальная база 10.2
Удаленная база 11.2

Имею УДАЛЕННЫЙ запрос - работает производительно

explain plan for
select 
        Substr(A.DEAL,7,11) ID_CONTRACT_SAP,
        Max(B.NAME_OBL) keep(Dense_Rank Last Order by A.ACCOUNT) DISTRICT,
        Max(B.TOWN)     keep(Dense_Rank Last Order by A.ACCOUNT) TOWN
  from CUSTOMER.T_BS_ACC_DEAL_REST@KHD.SAG A
  inner join REFER.T_BW_ORGUNIT@KHD.SAG B
     on (A.OBJID=B.OBJID and A.DATE_REP between B.BEGDA and B.ENDDA)
  where A.DATE_REP=Date '2014-09-30'
    and A.OBJID is not null
    and A.DEAL like '1000009%'
  group by A.DEAL; 
 select *
   from table(dbms_xplan.display)


Имею план 

   	PLAN_TABLE_OUTPUT
1	Plan hash value: 1712656327
2	 
3	------------------------------------------------------------------------------------------------------------------------
4	| Id  | Operation                | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop | Inst   |
5	------------------------------------------------------------------------------------------------------------------------
6	|   0 | SELECT STATEMENT REMOTE  |                    | 36572 |  3214K| 73939   (1)| 00:08:12 |       |       |        |
7	|   1 |  SORT GROUP BY           |                    | 36572 |  3214K| 73939   (1)| 00:08:12 |       |       |        |
8	|*  2 |   HASH JOIN              |                    | 36572 |  3214K| 73936   (1)| 00:08:12 |       |       |        |
9	|*  3 |    TABLE ACCESS FULL     | T_BW_ORGUNIT       |  1729 | 50141 |    80   (0)| 00:00:01 |       |       | DWH2U~ |
10	|   4 |    PARTITION RANGE SINGLE|                    |   149K|  8925K| 73853   (1)| 00:08:12 |  1053 |  1053 |        |
11	|*  5 |     TABLE ACCESS FULL    | T_BS_ACC_DEAL_REST |   149K|  8925K| 73853   (1)| 00:08:12 |  1053 |  1053 | DWH2U~ |
12	------------------------------------------------------------------------------------------------------------------------
13	 
14	Predicate Information (identified by operation id):
15	---------------------------------------------------
16	 
17	   2 - access("A2"."OBJID"="A1"."OBJID")
18	       filter("A2"."DATE_REP">="A1"."BEGDA" AND "A2"."DATE_REP"<="A1"."ENDDA")
19	   3 - filter("A1"."ENDDA">=TO_DATE(' 2014-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND 
20	              "A1"."BEGDA"<=TO_DATE(' 2014-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
21	   5 - filter("A2"."OBJID" IS NOT NULL AND "A2"."DEAL" LIKE '1000009%' AND "A2"."DATE_REP"=TO_DATE(' 2014-09-30 
22	              00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
23	 
24	Note
25	-----
26	   - fully remote statement


Делаю вставку в локальную базу, имею смену плана

explain plan for
 insert into AA00
 select 
        Substr(A.DEAL,7,11) ID_CONTRACT_SAP,
        Max(B.NAME_OBL) keep(Dense_Rank Last Order by A.ACCOUNT) DISTRICT,
        Max(B.TOWN)     keep(Dense_Rank Last Order by A.ACCOUNT) TOWN
   from CUSTOMER.T_BS_ACC_DEAL_REST@KHD.SAG A
  inner join REFER.T_BW_ORGUNIT@KHD.SAG B
     on (A.OBJID=B.OBJID and A.DATE_REP between B.BEGDA and B.ENDDA)
  where A.DATE_REP=Date '2014-09-30'
    and A.OBJID is not null
    and A.DEAL like '1000009%'
  group by A.DEAL; 
 select *
   from table(dbms_xplan.display)


   	PLAN_TABLE_OUTPUT
1	Plan hash value: 3188156897
2	 
3	-----------------------------------------------------------------------------------------
4	| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
5	-----------------------------------------------------------------------------------------
6	|   0 | INSERT STATEMENT |      |     1 |   106 |     8  (13)| 00:00:01 |        |      |
7	|   1 |  SORT GROUP BY   |      |     1 |   106 |     8  (13)| 00:00:01 |        |      |
8	|*  2 |   FILTER         |      |     1 |    52 |     5   (0)| 00:00:01 |        |      |
9	|   3 |    REMOTE        |      |       |       |            |          |    KHD | R->S |
10	-----------------------------------------------------------------------------------------
11	 
12	Predicate Information (identified by operation id):
13	---------------------------------------------------
14	 
15	   2 - filter("A"."DATE_REP"=TO_DATE('2014-09-30 00:00:00', 'yyyy-mm-dd 
16	              hh24:mi:ss') AND "B"."ENDDA">=TO_DATE('2014-09-30 00:00:00', 'yyyy-mm-dd 
17	              hh24:mi:ss') AND "B"."BEGDA"<=TO_DATE('2014-09-30 00:00:00', 'yyyy-mm-dd 
18	              hh24:mi:ss'))
19	 
20	Remote SQL Information (identified by operation id):
21	----------------------------------------------------
22	 
23	   3 - SELECT "A1"."DATE_REP","A1"."OBJID","A1"."DEAL","A1"."DEAL","A1"."ACCOUNT"
24	       ,"A1"."ACCOUNT","A1"."DEAL","A1"."OBJID","A1"."DATE_REP","A2"."NAME_OBL","A2"."TO
25	       WN","A2"."OBJID","A2"."BEGDA","A2"."ENDDA" FROM "CUSTOMER"."T_BS_ACC_DEAL_REST" 
26	       "A1","REFER"."T_BW_ORGUNIT" "A2" WHERE "A1"."OBJID"="A2"."OBJID" AND 
27	       "A1"."DATE_REP">="A2"."BEGDA" AND "A1"."DATE_REP"<="A2"."ENDDA" AND "A1"."OBJID" 
28	       IS NOT NULL AND "A1"."DEAL" LIKE '1000009%' (accessing 'KHD.SAG' )
29	 


Производительность упала !!!!!!


Локальная база 11.2 (меняю версию база)
Удаленная база 11.2

explain plan for
 insert into AA00
 select 
        Substr(A.DEAL,7,11) ID_CONTRACT_SAP,
        Max(B.NAME_OBL) keep(Dense_Rank Last Order by A.ACCOUNT) DISTRICT,
        Max(B.TOWN)     keep(Dense_Rank Last Order by A.ACCOUNT) TOWN
   from CUSTOMER.T_BS_ACC_DEAL_REST@KHD.SAG A
  inner join REFER.T_BW_ORGUNIT@KHD.SAG B
     on (A.OBJID=B.OBJID and A.DATE_REP between B.BEGDA and B.ENDDA)
  where A.DATE_REP=Date '2014-09-30'
    and A.OBJID is not null
    and A.DEAL like '1000009%'
  group by A.DEAL;
select *
  from table(dbms_xplan.display)


   	PLAN_TABLE_OUTPUT
1	Plan hash value: 1788691278
2	 
3	----------------------------------------------------------------------
4	| Id  | Operation                | Name | Cost (%CPU)| Inst   |IN-OUT|
5	----------------------------------------------------------------------
6	|   0 | INSERT STATEMENT         |      |     0   (0)|        |      |
7	|   1 |  LOAD TABLE CONVENTIONAL | AA00 |            |        |      |
8	|   2 |   REMOTE                 |      |            |    KHD | R->S |
9	----------------------------------------------------------------------
10	 
11	Remote SQL Information (identified by operation id):
12	----------------------------------------------------
13	 
14	   2 - EXPLAIN PLAN INTO PLAN_TABLE@! FOR SELECT 
15	       SUBSTR("A2"."DEAL",7,11),MAX("A1"."NAME_OBL") KEEP (DENSE_RANK FIRST  
16	       ORDER BY "A2"."ACCOUNT" DESC ),MAX("A1"."TOWN") KEEP (DENSE_RANK FIRST  
17	       ORDER BY "A2"."ACCOUNT" DESC ) FROM "CUSTOMER"."T_BS_ACC_DEAL_REST" 
18	       "A2","REFER"."T_BW_ORGUNIT" "A1" WHERE "A2"."DATE_REP"=TO_DATE(' 
19	       2014-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "A2"."OBJID" IS NOT 
20	       NULL AND "A2"."DEAL" LIKE '1000009%' AND "A2"."OBJID"="A1"."OBJID" AND 
21	       "A2"."DATE_REP">="A1"."BEGDA" AND "A2"."DATE_REP"<="A1"."ENDDA" AND 
22	       "A1"."BEGDA"<=TO_DATE(' 2014-09-30 00:00:00', 'syyyy-mm-dd hh24:mi:ss') 
23	       AND "A1"."ENDDA">=TO_DATE(' 2014-09-30 00:00:00', 'syyyy-mm-dd 
24	       hh24:mi:ss') GROUP BY "A2"."DEAL" (accessing 'KHD.SAG' )
25	 


Производительсть удовлетворяет !!

На продуктиве сменить версию локальной базе не имею возможности
(сделать VIEW на удаленной базе - тоже не имею полномочий)
Как и чем можно преобразовать план оптимизации и установить мне необходимый

Заранее благодарен !
16 окт 14, 13:01    [16713247]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
-2-
Member

Откуда:
Сообщений: 15330
HOME_X,


bulk fetch+insert
16 окт 14, 13:11    [16713348]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
KoTTT
Member

Откуда: Екб
Сообщений: 1511
Можно написать процедуру, которая будет открывать курсор с первым запросом, фетчить из него записи пачками и затем пачками же вставлять в локальную таблицу.
16 окт 14, 13:11    [16713350]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
KoTTT
Можно написать процедуру, которая будет открывать курсор с первым запросом, фетчить из него записи пачками и затем пачками же вставлять в локальную таблицу.


Это нужно использовать PL/SQL - обьемы передачи данных до 5-7 млн. долго будет !!!

Хотелось бы заставить ядро работать .....
16 окт 14, 13:20    [16713442]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
KoTTT
Member

Откуда: Екб
Сообщений: 1511
HOME_X
Это нужно использовать PL/SQL - обьемы передачи данных до 5-7 млн. долго будет !!!

Если правильно написать, будет не дольше любых других вариантов.
См.
-2-
bulk fetch+insert
16 окт 14, 13:30    [16713536]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Можно типа этого попробовать:
 insert into AA00
select * from(
 select /*+ no_merge */  
        Substr(A.DEAL,7,11) ID_CONTRACT_SAP,
        Max(B.NAME_OBL) keep(Dense_Rank Last Order by A.ACCOUNT) DISTRICT,
        Max(B.TOWN)     keep(Dense_Rank Last Order by A.ACCOUNT) TOWN
   from CUSTOMER.T_BS_ACC_DEAL_REST@KHD.SAG A
  inner join REFER.T_BW_ORGUNIT@KHD.SAG B
     on (A.OBJID=B.OBJID and A.DATE_REP between B.BEGDA and B.ENDDA)
  where A.DATE_REP=Date '2014-09-30'
    and A.OBJID is not null
    and A.DEAL like '1000009%'
  group by A.DEAL);
Но через bulk collect как-то лучше наверное.
16 окт 14, 13:36    [16713624]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
KoTTT,

Это имеете в виду или что-то другое ?

5-7 млн. INSERT будет быстро ?

DECLARE
   TYPE tA IS TABLE OF FOO.A%TYPE INDEX BY PLS_INTEGER;
   TYPE tB IS TABLE OF FOO.B%TYPE INDEX BY PLS_INTEGER;
   TYPE tC IS TABLE OF FOO.C%TYPE INDEX BY PLS_INTEGER;
   rA tA;
   rB tB;
   rC tC;
BEGIN
   SELECT * BULK COLLECT INTO rA, rB, rC FROM FOO;
   FORALL i IN r.FIRST..r.LAST
      INSERT INTO BAR(A,B,C) VALUES(rA(i),rB(i),rC(i));
END;



Буду признателен если научите "ПОРАБОТАТЬ" с планом оптимизации.
Если знаете как - подскажите.
16 окт 14, 13:37    [16713631]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
HOME_X,
попробуй с no_merge
16 окт 14, 13:38    [16713637]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
KoTTT
Member

Откуда: Екб
Сообщений: 1511
HOME_X,

declare
	cursor c
	is
		select .... from tbl@remote;
	type t is table of c%rowtype index by binary_integer;
	v t;
begin
	open c;
	loop
		fetch c bulk collect into v limit 1000;
		exit when c.count = 0;
		forall i in 1 .. c.count
			insert into tbl_local
			values v (i);
	end loop;
	close c;
end;


Возможности повлиять на план удаленного запроса в случае с распределенным dml, как у вас, ограничены.
Проще и надежнее часто оказывался подобный pl/sql.

И с "no_merge" попробуйте, конечно.
16 окт 14, 13:51    [16713773]     Ответить | Цитировать Сообщить модератору
 Re: Как задать план оптимизации при работе с удал. базой  [new]
HOME_X
Member

Откуда:
Сообщений: 2544
wurdu
Можно типа этого попробовать:
 insert into AA00
select * from(
 select /*+ no_merge */  
        Substr(A.DEAL,7,11) ID_CONTRACT_SAP,
        Max(B.NAME_OBL) keep(Dense_Rank Last Order by A.ACCOUNT) DISTRICT,
        Max(B.TOWN)     keep(Dense_Rank Last Order by A.ACCOUNT) TOWN
   from CUSTOMER.T_BS_ACC_DEAL_REST@KHD.SAG A
  inner join REFER.T_BW_ORGUNIT@KHD.SAG B
     on (A.OBJID=B.OBJID and A.DATE_REP between B.BEGDA and B.ENDDA)
  where A.DATE_REP=Date '2014-09-30'
    and A.OBJID is not null
    and A.DEAL like '1000009%'
  group by A.DEAL);
Но через bulk collect как-то лучше наверное.


Увы ..... не хочет
explain plan for
insert into AA00
select * 
  from (select /*+ no_merge */  
               Substr(A.DEAL,7,11) ID_CONTRACT_SAP,
               Max(B.NAME_OBL) keep(Dense_Rank Last Order by A.ACCOUNT) DISTRICT,
               Max(B.TOWN)     keep(Dense_Rank Last Order by A.ACCOUNT) TOWN
          from CUSTOMER.T_BS_ACC_DEAL_REST@KHD.SAG A
         inner join REFER.T_BW_ORGUNIT@KHD.SAG B
            on (A.OBJID=B.OBJID and A.DATE_REP between B.BEGDA and B.ENDDA)
         where A.DATE_REP=Date '2014-09-30'
           and A.OBJID is not null
           and A.DEAL like '1000009%'
         group by A.DEAL
       );
select *
   from table(dbms_xplan.display)

   	PLAN_TABLE_OUTPUT
1	Plan hash value: 3375854546
2	 
3	-----------------------------------------------------------------------------------------
4	| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
5	-----------------------------------------------------------------------------------------
6	|   0 | INSERT STATEMENT |      |     1 |    30 |     8  (13)| 00:00:01 |        |      |
7	|   1 |  VIEW            |      |     1 |    30 |     8  (13)| 00:00:01 |        |      |
8	|   2 |   SORT GROUP BY  |      |     1 |   106 |     8  (13)| 00:00:01 |        |      |
9	|*  3 |    FILTER        |      |     1 |    52 |     5   (0)| 00:00:01 |        |      |
10	|   4 |     REMOTE       |      |       |       |            |          |    PRU | R->S |
11	-----------------------------------------------------------------------------------------
12	 
13	Predicate Information (identified by operation id):
14	---------------------------------------------------
15	 
16	   3 - filter("A"."DATE_REP"=TO_DATE('2014-09-30 00:00:00', 'yyyy-mm-dd 
17	              hh24:mi:ss') AND "B"."ENDDA">=TO_DATE('2014-09-30 00:00:00', 'yyyy-mm-dd 
18	              hh24:mi:ss') AND "B"."BEGDA"<=TO_DATE('2014-09-30 00:00:00', 'yyyy-mm-dd 
19	              hh24:mi:ss'))
20	 
21	Remote SQL Information (identified by operation id):
22	----------------------------------------------------
23	 
24	   4 - SELECT "A1"."DATE_REP","A1"."OBJID","A1"."DEAL","A1"."DEAL","A1"."ACCOUNT"
25	       ,"A1"."ACCOUNT","A1"."DEAL","A1"."OBJID","A1"."DATE_REP","A2"."NAME_OBL","A2"."TO
26	       WN","A2"."OBJID","A2"."BEGDA","A2"."ENDDA" FROM "CUSTOMER"."T_BS_ACC_DEAL_REST" 
27	       "A1","REFER"."T_BW_ORGUNIT" "A2" WHERE "A1"."OBJID"="A2"."OBJID" AND 
28	       "A1"."DATE_REP">="A2"."BEGDA" AND "A1"."DATE_REP"<="A2"."ENDDA" AND "A1"."OBJID" 
29	       IS NOT NULL AND "A1"."DEAL" LIKE '1000009%' (accessing 'KHD.SAG' )
30	 
16 окт 14, 13:54    [16713804]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить