AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

49
1/49 Automatizar procesos de ETL con PL/SQL Ing. Nelson Calero, OCP [email protected] AROUG BI Day – 12 de Junio 2013 Buenos Aires, Argentina

description

Presentación dada en BI DAY 2013 organizado por el grupo de usuarios Oracle de Argentina (AROUG) el 12 de junio de 2013. Difusión del evento: http://aroug.org/2013/05/bi-day-reserva-tu-lugar/

Transcript of AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

Page 1: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

1/49

Automatizar procesos de ETL con PL/SQL

Ing. Nelson Calero, [email protected]

AROUG BI Day – 12 de Junio 2013Buenos Aires, Argentina

Page 2: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

2/49

Nelson Calero

• http://www.linkedin.com/in/ncalero

• Ingeniero en Computación. OCP DBA 10g. Especializado en RAC

• Trabajando con herramientas Oracle y entorno linux desde 1996

• DBA Oracle (desde 2001) & MySQL (desde 2005)

• Instructor de Oracle University desde 2011

• Co-fundador y Presidente del Grupo de Usuarios Oracle de Uruguay (UYOUG) desde 2009

• Orador frecuente en eventos como el Oracle OpenWorld Latinoamérica, Collaborate, OTN Tour Uruguay, JIAP, MySQL Argentina

• Co-fundador y director de Awen Consulting

Page 3: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

3/49

Objetivo

1) Implementar de solución para cargar datos de archivos de texto a Oracle, automatizando todo lo posible, incluyendo:

a) Manejo de excepciones

b) Evitar cargas duplicadas (y más controles)

c) Ejecución automática

d) Informe del resultado de ejecución

e) Retoma de carga fallidas

2) Ver detalles de– Instalación– Mantenimiento– Performance

Page 4: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

4/49

Alternativas

• Herramientas ETL– Warehouse Builder– Kettle – open source, kettle.pentaho.com

• Programar usando lenguaje/framework con JDBC/ODBC– C, java, perl, python, ...

• Scripts sobre funcionalidades propias de Oracle– SQL*Loader– Tablas externas– Funciones pipeline

Page 5: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

5/49

¿Que vamos a usar?

• Oracle Standard Edition 11.2 (>=9i)

• PL/SQL

• Jobs en la base de datos

• Tablas externas

• Archivos con datos en texto plano visibles en un directorio del servidor de base de datos

• NOTA1 : solución “old school”

NOTA2 : vamos a ver una solución de ejemplo basado en las definiciones mostradas. Hay otras formas de implementar lo mismo, dependiendo de la conveniencia de usar estas definiciones.

Page 6: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

6/49

Tablas externas

CREATE TABLE.. ORGANIZATION EXTERNAL.. LOCATION ('archivo.txt')

• Disponible desde la versión 9i

• Acceso solo lectura con driver ORACLE_LOADER, lectura/escritura con driver ORACLE_DATAPUMP

• No ocupa espacio en la base de datos. Es metadata del archivo

• Permite paralelismo (tipos de datos no variables)

• El archivo debe ser accesible desde el servidor de BD

• Parámetros de acceso por defecto optimizados

• Desde 11.2 (y 11.1.0.7) puede ejecutar comando para pre-procesar antes de leer (ej : gzip)

Page 7: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

7/49

Ejemplo

CREATE TABLE dw.paises_txt (

country_code VARCHAR2(2),

country_name VARCHAR2(40),

country_number VARCHAR2(3)

)

ORGANIZATION EXTERNAL (

TYPE ORACLE_LOADER

DEFAULT DIRECTORY datos

ACCESS PARAMETERS (

RECORDS DELIMITED BY NEWLINE

PREPROCESSOR exec:'zcat'

FIELDS TERMINATED BY ';'

MISSING FIELD VALUES ARE NULL

(

country_code CHAR(2),

country_name CHAR(40),

country_number CHAR(3)

)

)

LOCATION ('paises.txt.gz')

)

REJECT LIMIT UNLIMITED;

paises.txt – columnas separadas por coma

Page 8: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

8/49

Ejemplo

CREATE TABLE dw.paises_txt (

country_code VARCHAR2(2),

country_name VARCHAR2(40),

country_number VARCHAR2(3)

)

ORGANIZATION EXTERNAL (

TYPE ORACLE_LOADER

DEFAULT DIRECTORY datos

ACCESS PARAMETERS (

RECORDS DELIMITED BY NEWLINE

PREPROCESSOR exec:'zcat'

FIELDS TERMINATED BY ';'

MISSING FIELD VALUES ARE NULL

(

country_code CHAR(2),

country_name CHAR(40),

country_number CHAR(3)

)

)

LOCATION ('paises.txt.gz')

)

REJECT LIMIT UNLIMITED;

paises.txt – columnas separadas por coma

Page 9: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

9/49

Ejemplo

CREATE TABLE dw.paises_txt (

country_code VARCHAR2(2),

country_name VARCHAR2(40),

country_number VARCHAR2(3)

)

ORGANIZATION EXTERNAL (

TYPE ORACLE_LOADER

DEFAULT DIRECTORY datos

FIELDS (

country_code POSITION(01:02) CHAR,

country_name POSITION(03:42) CHAR,

country_number POSITION(43:45) CHAR

)

)

LOCATION ('paises-pos.txt')

)

REJECT LIMIT UNLIMITED;

paises-pos.txt – columnas de ancho fijo

Page 10: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

10/49

Tablas externas

• Directorios : – CREATE OR REPLACE DIRECTORY datos AS '/DW/datos';– CREATE OR REPLACE DIRECTORY exec AS '/DW/bin';– GRANT read,write ON DIRECTORY datos TO dw;– GRANT read,execute ON DIRECTORY exec TO dw;

• ACCESS Parameters: muchos. similares a SQL*Loader

• Se generan archivos de log y rechazos en cada SELECT– tabla_PID.log / tabla_PID.bad– Configurable con : badfile/logfile datos:archivo

Page 11: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

11/49

Tablas externas

• Vista DB_EXTERNAL_LOCATIONS:

SYS@XE> select * from dba_external_locations;

OWNER TABLE_NAME LOCATION DIR DIRECTORY_NAME

---------- -------------------- ----------------- --- ---------------

DW PAISES_GZ_TXT paises.txt.gz SYS DATOS

DW PAISES_POS_TXT paises-pos.txt SYS DATOS

DW PAISES_TXT paises-big.txt SYS DATOS

DW DT_CONTROL_TXT DT_CONTROL.TXT SYS DATOS

DW PAISES_NUM_TXT paises-big.txt SYS DATOS

Page 12: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

12/49

A tener en cuenta

• Tablas externas con columnas DATE puede generar excepciones al leer– FECHA_ALTA POSITION (46:59) DATE "YYYY-MM-DD-HH24-MI-SS"

• Registros de ancho variable no permiten paralelismo• Transformaciones se instrumentan en el select• Migrar de SQL*Loader con opcion en el controlfile

– options (external_table=generate_only)– en logfile genera creación de Directory y TE, y ejemplo de insert

• TE en RAC: usando ocfs2 o DBFS (desde 11.2)• Se pueden cargar LOBs

– nombre de archivos en registros– archivo por cada lob– clausula COLUMN TRANSFORMS en TE

Page 13: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

13/49

LOBs

CREATE TABLE dw.lob_tab (

Datos VARCHAR2(100),

datos_clob CLOB,

datos_blob BLOB

)

ORGANIZATION EXTERNAL

(

TYPE ORACLE_LOADER

DEFAULT DIRECTORY datos

ACCESS PARAMETERS

(

RECORDS DELIMITED BY NEWLINE

FIELDS TERMINATED BY ';'

MISSING FIELD VALUES ARE NULL

(

datos CHAR(100),

archivo_clob CHAR(100),

archivo_blob CHAR(100)

)

COLUMN TRANSFORMS (datos_clob FROM LOBFILE (archivo_clob) FROM (datos) CLOB,

datos_blob FROM LOBFILE (archivo_blob) FROM (datos) BLOB)

)

LOCATION ('lob-datos.txt')

)

REJECT LIMIT UNLIMITED;

Page 14: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

14/49

Tablas externas

• Ejemplos– select/insert (ej1.sql)– Cargar LOBs con TE (ej-lob.sql)– Modificar atributos (ej2.sql)– Casos de error (ej3.sql)

Page 15: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

15/49

Tablas externas

• Ejemplos– select/insert (ej1.sql)– Cargar LOBs con TE (ej-lob.sql)– Modificar atributos (ej2.sql)– Casos de error (ej3.sql)

• Error de formato en datos filtrados por tabla externa van al archivo de rechazos (badfile)

• Error de formato en datos no detectados en la tabla externa generan error SQL al manipularlo

Page 16: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

16/49

Manejo de errores (ej4.sql)

BEGIN Insert into DW.tabla Select * from tabla_txt;EXCEPTION WHEN others THEN --- capturamos errores de acceso a la tabla externa *y* de SQL al insertar IF DBMS_UTILITY.FORMAT_ERROR_STACK LIKE '%KUP-04040%' THEN dbms_output.put_line ('# no existe archivo para TABLA'); ELSIF DBMS_UTILITY.FORMAT_ERROR_STACK LIKE '%ORA-30653%' THEN dbms_output.put_line ('# ERROR: problemas en datos de TABLA'); ELSE dbms_output.put_line ('# ERROR procesando TABLA'); Raise; END IF;END;

Códigos de error: http://docs.oracle.com/cd/B19306_01/server.102/b14219/kupus.htm

Page 17: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

17/49

Objetivos (repaso)

Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo:

a) Manejo de excepciones

b) Evitar cargas duplicadas (y más controles)

c) Ejecución automática

d) Informe del resultado de ejecución

e) Retoma de carga fallidas

Page 18: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

18/49

Controles posibles

Algunos imprescindibles:

1) Existencia de archivos a cargar (ej-lanza.sql)– Archivo de control indicando nuevos datos (p.ej: hay_datos.txt)– utl_file.fgetattr('DATOS',l_archivo,l_existe,l_size,l_blk_size);

2) Datos en archivo coincida con datos esperados (fecha)

3) Evitar cargas duplicadas

4) Cantidad de registros en archivo sean los esperados

5) Suma de una columna coincida con la esperada (u otra operación arbitraria)

Page 19: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

19/49

Control 1 – Existenciacreate or replace procedure p_job_carga as

declare

ex BOOLEAN;

flen NUMBER;

bsize NUMBER;

v_archivo VARCHAR2(50) := 'HAY_DATOS.TXT';

v_dir VARCHAR2(50) := 'DATOS';

BEGIN

dbms_output.enable;

utl_file.fgetattr(v_dir, v_archivo, ex, flen, bsize);

IF ex THEN -- existe archivo, se ejecuta carga y se quita marca de procesar

p_ejecutar_carga;

utl_file.fremove(v_dir, v_archivo);

else

DBMS_OUTPUT.PUT_LINE('No se procesan datos, no existe archivo '||v_archivo);

END IF;

p_registro_informe;

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE ('ERROR en la ejecución del job');

DBMS_OUTPUT.PUT_LINE (SQLERRM);

p_registro_informe;

END;

Page 20: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

20/49

Control 2

Datos en archivo coincida con datos esperados – Objetivo: Detectar error en manipulación de archivos de datos por operadores– Fecha (o identificación) en los datos– Archivo de control para validar : DT_CONTROL.TXT

CREATE TABLE "DW"."DT_CONTROL" ( "FECHA_DATOS" DATE, "TABLA" VARCHAR2(100), "NUM_REG" NUMBER(15), "COL_CTL" VARCHAR2(100), "TOT_CTL" NUMBER(15) );

• Tabla externa DT_CONTROL_TXT• Esta tabla se borra con cada nueva carga

– Mantenemos historia luego de cargas exitosas: "DW"."DT_CONTROL_HIST"

Page 21: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

21/49

Control 3

Evitar cargas duplicadas– Por archivo o global. Si permitimos cargas parciales (algún archivo da error y

pero se cargan el resto) es por archivo => Fecha_dato en el archivo de datos• como nueva columna => mucha redundancia• como primer registro => select * from tabla_txt where rownum=1

skip=1 para siguiente select (alter table..)

– Tabla de Log de cargas anteriores: se valida que la fecha actual no exista

CREATE TABLE "DW"."LOG_CARGA"

( "FECHA_CARGA" DATE,

"TABLA" VARCHAR2(255),

"FECHA_DATOS" DATE

);

Page 22: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

22/49

Control 4

create table tabla_bad_ext

( text1 varchar2(4000) ,

text2 varchar2(4000) )

organization external

(type oracle_loader

default directory datos

access parameters (

records delimited by newline

Fields missing field values are null

( text1 position(1:4000),

text2 position(4001:8000) )

) location ('tabla.bad')

)

select count(*) from tabla_bad_ext;

Cantidad de registros en archivo sean los esperados– Primer registro de datos o información adicional fuera de los datos (archivo de control,

usado para control 2)– Se puede validar el total cargado con ese valor, o buscar existencia de rechazos (.bad)

Page 23: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

23/49

Control 5

• Suma de una columna coincida con la esperada (u otra operación arbitraria)

– Permite identificar errores en la generación del archivo de datos (p.ej: columnas fuera de orden o con datos inválidos)

Page 24: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

24/49

Objetivos (repaso)

Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo:

a) Manejo de excepciones

b) Evitar cargas duplicadas (y más controles)

c) Ejecución automática

d) Informe del resultado de ejecución

e) Retoma de carga fallidas

Page 25: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

25/49

Ejecución automática

• Agendar job que lance la carga variable v_job number;

exec dbms_job.submit (:v_job, 'p_job_carga;',

sysdate, 'f_intervalo');

commit;

• Reintentar durante N días– Función en next_date f_intervalo

Page 26: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

26/49

Ejecución automática

-- calcula la fecha de proxima ejecucion del job de cargacreate or replace function dw.f_intervalo return date is v_mes date := trunc(sysdate,'MON');begin if trunc(sysdate) between v_mes+3 and v_mes+13 then – entre el 4 y 14 return trunc(sysdate)+1+1/24; -- dia siguiente a la 1:00 am elsif trunc(sysdate) > v_mes+13 then – después del 14 -- mes siguiente día 4 a la 1:00 am return add_months(trunc(sysdate,'MON')+3, 1) + 1/24; Else – antes del 4 return trunc(sysdate,'MON')+3 + 1/24; -- 10 del mes actual a la 1:00 am end if;End;

Page 27: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

27/49

Crear informe

• Varias alternativas– Generar datos en tabla temporal de log al cargar cada

tabla, select como último paso– Spool en sqlplus– Escribir archivo en el servidor con paquete UTL_FILE

• En lugar de insertar en tabla de log/spool• Capturar salida de dbms_output. Sirve para encapsular

código ya existente, y es práctico para testear. Límite de 1Mb en 9.2, ilimitado desde 10.2

– Buena discusión de opciones: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:146412348066

Page 28: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

28/49

Informe con dbms_output(ej-informe.sql)

archivo := 'informe_carga_'||to_char(sysdate,'yyyymmdd')||'.log'; output_file := utl_file.fopen ('DATOS', archivo, 'A'); loop status := max_lines; DBMS_OUTPUT.GET_LINES ( output_table, status); FOR linenum in 1..status LOOP BEGIN utl_file.put_line (output_file, NVL (output_table(linenum),'<null>')); EXCEPTION WHEN OTHERS THEN utl_file.put_line (output_file, 'Error: linea '||linenum||' -'||sqlerrm); END; END LOOP; exit when status < max_lines; -- no quedan mas lineas por leer end loop; utl_file.fclose(output_file);

Page 29: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

29/49

Objetivos (repaso)

Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo:

a) Manejo de excepciones

b) Evitar cargas duplicadas (y más controles)

c) Ejecución automática

d) Informe del resultado de ejecución

e) Retoma de carga fallidas

Page 30: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

30/49

Retoma de fallas

Simplificando el procedimiento de carga:– Controlar datos tabla1– Cargar tabla1– Manejo excepciones1– Controlar datos tabla2– Cargar tabla2– Manejo excepciones2– …– Controlar datos tablaN– Cargar tablaN– Manejo excepcionesN

Page 31: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

31/49

Procedimiento de carga

Para evitar repetir código:– Control de datos genérico– Uso de tabla de configuración (CARGA_DEF).

indica que tablas hay que cargar:• Nombre de tabla destino• Nombre de tabla externa• Tipo de carga (incremental o reemplazo)• Columna usada para control de fecha • Columna usada para control de suma

Page 32: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

32/49

Procedimiento de carga

-– Función para controlar integridad de archivos a cargar

function f_control (p_tabla in varchar2, p_fecha_dato out number, p_replace out boolean) return number isBegin Lee dt_carga_def Controla fecha de datos sea la fecha a cargar

Si tipo_carga = APPEND Controla que no hayan datos de esa fecha cargados Valida cantidad de registros en archivo sean los indicados Valida columna de suma (si se indica) Retorna #registros (codigos de error son negativos)End;

Page 33: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

33/49

Procedimiento de carga

-– Procedimiento de carga genéricoProcedure p_carga_generica (p_tabla in varchar2, p_tabla_txt in varchar2)Begin v_reg_ctl := f_control (p_tabla, v_fecha, v_replace); Si v_reg_ctl > 0 (éxito) Si carga REPLACE => truncar tabla Execute immediate 'insert /*+ APPEND */ … select * from TE' Validar #registros insertados sean los indicados Registrar carga en tabla de log Archivar (historia) registro de cargaException Rollback de esta tabla Loguear error y continuarEnd;

Page 34: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

34/49

Procedimiento de carga

-– Procedimiento de carga globalProcedure p_ejecutar_cargaBegin Cargar registros de control (desde TE. Indica tablas a cargar y valores p/control) Validar que no se haya hecho una carga completa igual Por cada tabla configurada para cargar Si no hubo carga anterior incompleta de esta tabla p_carga_generica (tabla);End;

Page 35: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

35/49

Objetivos (repaso)

Cargar datos en archivos de texto a Oracle, automatizando todo lo posible, incluyendo:

a) Manejo de excepciones

b) Evitar cargas duplicadas (y más controles)

c) Ejecución automática

d) Informe del resultado de ejecución

e) Retoma de carga fallidas

Page 36: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

36/49

Ejecución completa

Rutinas involucradas:• Job en la base

– f_next_date– p_job_carga

• p_registro_informe• p_ejecutar_carga

– f_control– p_carga_generica

Page 37: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

37/49

Instalación

• Directorio de datos – Creación en file system– Permisos de acceso para Oracle, y a los archivos– Creación de directorio en Oracle y permisos

• Creación de tablas externas para las tablas de datos• Creación de tabla de control y externa• Creación de tabla de definiciones

– Cargar definiciones

• Creación de procedimientos de carga• Creación de rutinas auxiliares para job• Creación de job

Page 38: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

38/49

Ejemplo

• Código en crea_pck_load.sql – Revisar e instalar

• Ejecución completa ok y con error – Analizar datos e informes

Page 39: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

39/49

¿Cargar nuevas tablas?

• Debemos:– Crear nueva tabla destino– Crear nueva tabla externa– Agregar registro de configuración – Agregar código pl/sql para carga

• Se puede automatizar generando el código de ambos

Page 40: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

40/49

Generar código

declare

cursor c_cols is

select owner, table_name

from dw.dw_carga_def

where owner=v_owner

order by table_name;

procedure p (p_str in varchar2) is

begin

insert into gen_aux

values (s_orden.nextval, p_str);

end;

Begin

p('create or replace package '||v_owner||'.k_carga is');

for r_cols in c_cols loop

p(' procedure p_'||r_cols.table_name||';');

end loop;

...

End;

set linesize 120 pagesize 0

set trimspool on

set feedback off

spool /tmp/archivo.sql

select dato

from gen_aux

order by orden;

spool off

Page 41: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

41/49

Ejemplo: crear las TE

• script PL/SQL: gen-tab-txt.sql– Genera crea_tab_txt.sql

• Datos delimitados. Para posicionales o con formatos especiales hay que ajustar el código.

Page 42: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

42/49

Código completo de carga

• script gen-pck-load.sql– Genera crea_pck_load.sql

• Mucho testing!!

Page 43: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

43/49

Performance

Recomendaciones– Definir tipo de datos en la TE para evitar transformaciones de

datos en SQL que impactan en la performance– Si hay columnas DATE en la TE, usar DATE_CACHE grande– Insertar en modo Direct Path: insert /*+ APPEND */ ...– Paralelismo es útil:

• Disponible en versión Enterprise. • Hay que evaluar capacidad del storage para no saturarlo. • No es necesario separar el archivo de datos• Se habilita con la cláusula “PARALLEL N” en la creación de la TE

– Optimizar el acceso a archivos de datos • si es un mapeo de red, validar enlace• no competir con acceso a datafiles

Page 44: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

44/49

Performance

¿Qué hacer si las cargas son lentas?– Tablas con pocos índices y muchos datos existentes:

deshabilitar índices antes de cargar– Muchos índices y muchos datos son un problema– Particionamiento puede ser útil con índices locales. Es

mas útil para tareas de mantenimiento posteriores (p.ej: quitar datos obsoletos) cuando las consultas lo permiten

– Si hay funciones de transformación, analizar peformance individual

– Ante dudas, SQL Trace revela donde está el problema

Page 45: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

45/49

Performance – SQL traceoracle@oraculo:/DW> sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Wed Jun 12 01:43:22 2013

Copyright (c) 1982, 2010, Oracle. All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

01:43:22 SYS@ent11g>select value from v$diag_info where name='Default Trace File';

VALUE

-------------------------------------------------------------------

/u01/app/oracle/diag/rdbms/ent11g/ent11g/trace/ent11g_ora_8683.trc

01:43:26 SYS@ent11g>alter session set sql_trace=true;

Session altered.

01:43:28 SYS@ent11g>select count(*) from dw.paises_pos_txt;

COUNT(*)

----------

239

01:43:31 SYS@ent11g>exit

oracle@oraculo:/DW> tkprof /u01/app/oracle/diag/rdbms/ent11g/ent11g/trace/ent11g_ora_8683.trc /tmp/pp.txt

TKPROF: Release 11.2.0.2.0 - Development on Wed Jun 12 01:44:02 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

Page 46: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

46/49

Performance – SQL traceoracle@oraculo:/DW> less /tmp/pp.txt

...

SQL ID: cmzwfgsvz52pq Plan Hash: 3582886107

select count(*)

from

dw.paises_pos_txt

call count cpu elapsed disk query current rows

------- ------ -------- ---------- ---------- ---------- ---------- ----------

Parse 1 0.00 0.00 0 0 0 0

Execute 1 0.00 0.01 0 24 0 0

Fetch 2 0.00 0.00 0 0 0 1

------- ------ -------- ---------- ---------- ---------- ---------- ----------

total 4 0.00 0.02 0 24 0 1

Misses in library cache during parse: 0

Optimizer mode: ALL_ROWS

Parsing user id: SYS

Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max) Row Source Operation

---------- ---------- ---------- ---------------------------------------------------

1 1 1 SORT AGGREGATE (cr=64 pr=0 pw=0 time=23669 us)

4 4 4 PX COORDINATOR (cr=64 pr=0 pw=0 time=17062 us)

0 0 0 PX SEND QC (RANDOM) :TQ10000 (cr=0 pr=0 pw=0 time=0 us)

0 0 0 SORT AGGREGATE (cr=0 pr=0 pw=0 time=0 us)

0 0 0 PX BLOCK ITERATOR (cr=0 pr=0 pw=0 time=0 us cost=8 size=0 card=8168)

0 0 0 EXTERNAL TABLE ACCESS FULL PAISES_POS_TXT (cr=0 pr=0 pw=0 time=0 us cost=8 size=0 card=8168)

Page 47: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

47/49

Conclusiones

• Esta solución requiere un esfuerzo inicial grande. Para pocas tablas y sin expectativas de modificaciones futuras, puede ser una complejidad excesiva.

• Desarrollo necesita dominio de PL/SQL. El mantenimiento puede realizarlo un operador.

• Esta implementación es de una solución en producción. Tomó unas 60 horas su desarrollo y puesta en funcionamiento en tres sistemas de la misma empresa.

• Si se tienen varias cargas distintas para automatizar, se gana mucho tiempo al generar el código a partir de la configuración.

Page 48: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

48/49

¿Preguntas?

[email protected]

Page 49: AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL

49/49

Referencias

• External table concepts 11.2 (utilities guide)http://docs.oracle.com/cd/E11882_01/server.112/e22490/et_concepts.htm

• Managing external tables 11.2 (admin guide)http://docs.oracle.com/cd/E24693_01/server.11203/e17120/tables013.htm#ADMIN01507

• Loading and Transformation 11.2 (DW guide)http://docs.oracle.com/cd/E24693_01/server.11203/e16579/transform.htm#DWHSG8312

• Usos interesantes de tablas externas con preproceso:– listing files with the external table preprocessor in 11g

http://www.oracle-developer.net/display.php?id=513– profiling trace files in 11g

http://www.oracle-developer.net/display.php?id=516–