Oracle Live

02/04/2016

Golden Gate – Optimización queries

Filed under: Golden Gate — mogukiller @ 1:39 am

Entre los procedimientos de optimización de los replicadores de Golden Gate es intentar optimizar las queries que esta ejecutando.
Como bien sabemos si en origen se ejecuta un update que afecta a 10K registros en destino Golden Gate ejecutara 10K, por lo que si no se tiene un plan de ejecucion optimo el lag del replicador aumentará.

-- Identificamos el sqlid que esta ejecutando el replicado.
'nota: identificamos el replicador por el modulo: replicat'

col column1 for a25 heading 'Inst/sid/serial/PID'
col column2 for a15 heading 'DB User'
col column3 for a35 heading 'Programm'
col column5 for a20 heading 'Start Time'
col column6 for a30 heading 'Wait Event'
col column7 heading 'Time Waiting'
col column8 for a30 heading 'sqllid / prev sqlid'
SELECT 
s.inst_id||' / '|| s.sid||' / '||s.SERIAL# ||' / '||p.SPID as column1,
NVL(s.username,'null') 					 as	column2,
SUBSTR(s.program,0,30)					 as column3,
TO_CHAR(s.LOGON_TIME,'YYYY/MM/DD HH24:MI:SS') as column5,
s.EVENT 									 as column6,
ROUND(s.SECONDS_IN_WAIT/100)				 as column7,
NVL(s.sql_id,'null')||' / '||s.prev_sql_id as column8
FROM GV$SESSION s, GV$PROCESS p
WHERE 1=1
AND S.PADDR=P.ADDR AND s.inst_id=p.inst_id
AND s.program LIKE '%replicat%'
ORDER BY s.inst_id, s.LOGON_TIME;

/*
Inst/sid/serial/PID       DB User         Programm                            Start Time           Wait Event                     Time Waiting sqllid / prev sqlid
------------------------- --------------- ----------------------------------- -------------------- ------------------------------ ------------ ------------------------------
2 / 926 / 31686 / 35462   UOG_MIGRA       replicat@mogube12c      			  2016/03/22 08:36:34  SQL*Net message from client               0 7byjy0738y88t / 7byjy0738y88t
*/

-- Miramos las estadisticas de ejecucion de ese sqlid
SELECT 
	sql_id,to_char(to_date(FIRST_LOAD_TIME,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS') sample_end,
	INST_ID||'/'||CHILD_NUMBER||'/'||PLAN_HASH_VALUE child_hash
      ,EXECUTIONS 
      ,ROUND(DISK_READS/EXECUTIONS,2) PIO_PER_EXEC
      ,ROUND(BUFFER_GETS/EXECUTIONS,2) LIO_PER_EXEC
	  ,ROUND(ELAPSED_TIME/1000/EXECUTIONS) TIME_PER_EXEC	  
    FROM GV$SQL
     WHERE SQL_ID='7byjy0738y88t';   

/*	 
                                                                              Physical Reads Logical Reads Time(misec)
SQL_ID        Hour sampled          Inst/Child/Hast Value          Executions       Per Exec      Per Exec    Per Exec
------------- --------------------- ------------------------------ ---------- -------------- ------------- -----------
7byjy0738y88t 2016/03/19 22:43:50   2/0/3188363245                    1842797              0       1933,94          23
*/


10:13:53 PUE0002 SQL>set long 10000
10:15:43 PUE0002 SQL>SELECT SQL_FULLTEXT FROM GV$SQL WHERE SQL_ID='&sqlid' and rownum<2;
Enter value for sqlid: 7byjy0738y88t

/*
SQL_FULLTEXT
--------------------------------------------------------------------------------
UPDATE "MOGU"."UE_EST_TEMP_AO" x SET x."CO_CLIENTE_IP" = :a14,x."CO_LOGIN" = :
a15,x."FX_SISTEMA" = :a16,x."NO_METODO" = :a17,x."NO_URI" = :a18,x."NO_PROTOCOLO
*/

-- Analizamos el plan de ejecucion.

10:15:45 PUE0002 SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sqlid','&child_number'));
Enter value for sqlid: 7byjy0738y88t
Enter value for child_number: 0

/*
----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT            |                |       |       |   350 (100)|          |
|   1 |  UPDATE                     | UE_EST_TEMP_AO |       |       |            |          |
|*  2 |   COUNT STOPKEY             |                |       |       |            |          |
|*  3 |    TABLE ACCESS STORAGE FULL| UE_EST_TEMP_AO |     1 |    23 |   350   (2)| 00:00:01 | <<<<< Seguro que falta un indice
----------------------------------------------------------------------------------------------
*/

-- Pasamos el SQL TUNE a ver que nos recomienda.

SET SERVEROUTPUT ON
declare
stmt_task VARCHAR2(100);
begin
stmt_task := DBMS_SQLTUNE.CREATE_TUNING_TASK(sql_id => '7byjy0738y88t');
DBMS_OUTPUT.put_line('task_id: ' || stmt_task );
end;
/
/*
task_id: TASK_1136
*/
   BEGIN
     DBMS_SQLTUNE.EXECUTE_TUNING_TASK( task_name => 'TASK_1136');
  end;
   /
/*
PL/SQL procedure successfully completed.
*/ 
SET LONG 100000
SET LONGCHUNKSIZE 1000
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK( 'TASK_1136') from DUAL;
/*
  Recommendation (estimated benefit: 98.85%)
  ------------------------------------------
  - Puede ejecutar el Asesor de Acceso para mejorar el diseño del esquema
    físico o crear el índice recomendado.
    create index MOGU.IDX$$_04700001 on
    MOGU.UE_EST_TEMP_AO("FX_SISTEMA","CO_LOGIN");
*/	

-- Aplicamos la recomendacion.

'nota: Tenemos dos opciones o paramos el replicador o creamos el indice online. 
A las malas se puede matar la sesion'
create index MOGU.IDX_MIGRA on MOGU.UE_EST_TEMP_AO("FX_SISTEMA","CO_LOGIN") ONLINE;

-- Pasamos estadisticas a la tabla para que coja el nuevo plan.
'nota: Utilizamos NO_INVALIDATE => FALSE, para que invalide los cursores que ya hay en la shared'

exec dbms_stats.gather_table_stats (ownname => 'MOGU',tabname =>'UE_EST_TEMP_AO', DEGREE=>4, CASCADE => TRUE, NO_INVALIDATE => FALSE);

-- Validamos que se haya cambiado el plan

/*
SQL_ID        SAMPLE_END          CHILD_HASH                     EXECUTIONS PIO_PER_EXEC LIO_PER_EXEC TIME_PER_EXEC
------------- ------------------- ------------------------------ ---------- ------------ ------------ -------------
7byjy0738y88t 2016/03/19 22:43:50 2/0/3188363245                       7450            0      8500,32            51
7byjy0738y88t 2016/03/23 10:27:54 1/0/4009215648                     118671          ,02        11,97             0 <<<< Ha mejorado
*/

-- Comprobamos que su plan de ejecucion ha cambiado
/*
--------------------------------------------------------------------------------------------------------
| Id  | Operation                             | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT                      |                |       |       |     4 (100)|          |
|   1 |  UPDATE                               | UE_EST_TEMP_AO |       |       |            |          |
|*  2 |   COUNT STOPKEY                       |                |       |       |            |          |
|*  3 |    TABLE ACCESS BY INDEX ROWID BATCHED| UE_EST_TEMP_AO |     1 |    34 |     4   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN                  | IDX_MIGRA      |     1 |       |     3   (0)| 00:00:01 |	<<<< Ya va por indice
--------------------------------------------------------------------------------------------------------
*/

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: