® Tablas Externas Informix Dynamic Server 11.50.xC6 Edgar D. Sanchez - edgarsan@us.ibm.com Informix Advanced Support Nota: Esta presentación esta basada en la conferencia dictada por Khaled Bentebal, Director General de la firma ConsultiX, durante el IIUG 2010 en Kansas City © 2010 IBM Corporation IBM Software Group | Information Management Agenda Que son Tablas Externas Porque utilizar Tablas Externas Como crear tablas externas Uso de Tablas Externas Otras herramientas de IDS para cargar/descargar datos Comparaciones de Performance Manipulando datos fuera del motor utilizando funciones SQL XML y las Tablas Externas Dbimport, dbexport, ontape, oncheck, onstat, SPLs,.... Nota: Esta presentación esta basada en la conferencia dictada por Khaled Bentebal de la firma ConsultiX durante el IIUG 2010 en Kansas City © 2009 IBM Corporation IBM Software Group | Information Management Que son Tablas Externas Son una fuente externa para almacenar datos, que no es parte del motor de Informix Dynamic Server (IDS) Una extension del estandard ANSI/ISO SQL Se encuentran presentes en Informix XPS Diseñadas para cargar/descargar datos desde/hacia las Bases de Datos de una forma sencilla utilizando sentencias SQL Disponible a partir de la version IDS 11.50.xC6 Similar a la herramienta dbload en su funcionalidad © 2009 IBM Corporation IBM Software Group | Information Management Que son Tablas Externas © 2009 IBM Corporation IBM Software Group | Information Management Porque utilizar Tablas Externas Transferencia the datos operacionales eficientemente desde/hacia otros sistemas Transferir archivos de datos entre plataformas utilizando formato de IDS Utilizar el servidor de Base de Datos para convertir datos entre ASCII delimitado y ASCII de formato fijo Proporcionar operaciones paralelas de INSERT estandard de datos de tal forma que los datos puedan ser cargados sin borrar los indices Utilizar 'named pipes' para soportar la carga y descarga de datos de dispositivos de almacenamiento, incluyendo Unidades de Cinta y Conexiones de Red © 2009 IBM Corporation IBM Software Group | Information Management Como crear Tablas Externas • CREATE EXTERNAL TABLE <tablename> (<column list>) USING (DATAFILES (x1 [,x2, …] ) , <table options>); • CREATE EXTERNAL TABLE SAMEAS <templatetable> USING (DATAFILES (x1 [,x2, …] ) , <table options>); © 2009 IBM Corporation IBM Software Group | Information Management Creacion de una Tabla Externa - DISK CREATE EXTERNAL TABLE ext_customer_delimited ( customer_num int, name char(30), lname char(30), address varchar(50), zip char(5)) USING ( DATAFILES ( « DISK: /opt/external/data1.unl » ) FORMAT « DELIMITED », REJECTFILE « /opt/rejects/reject_data1.rej », MAXERRORS 1000, DELUXE ); © 2009 IBM Corporation IBM Software Group | Information Management Creacion de una Tabla Externa - DISK CREATE EXTERNAL TABLE ext_customer_fixed ( customer_num int, name char(30) EXTERNAL char(20), lname char(30) EXTERNAL char(25), address varchar(50) EXTERNAL char(45), zip char(5) EXTERNAL char(5)) USING ( DATAFILES ( « DISK: /opt/external/data2.unl » ) FORMAT « FIXED », REJECTFILE « /opt/rejects/reject_data2.rej », MAXERRORS 100, DELUXE ); © 2009 IBM Corporation IBM Software Group | Information Management Creacion de una Tabla Externa - DISK CREATE EXTERNAL TABLE ext_customer_delimited SAMEAS customer USING ( DATAFILES ( « DISK: /opt/external/data3.unl » ) FORMAT « DELIMITED », REJECTFILE « /opt/rejects/reject_data3.rej », MAXERRORS 1000, DELUXE ); ‘check constraints’ no son heredados con la excepcion de constraints ‘NOT NULL’ © 2009 IBM Corporation IBM Software Group | Information Management Creacion de una Tabla Externa - PIPE CREATE EXTERNAL TABLE ext_customer _fifo SAMEAS customer USING ( DATAFILES ( « PIPE: /opt/external/FIFO.dat » ) FORMAT « DELIMITED », REJECTFILE « /opt/rejects/reject_FIFO.rej », MAXERRORS 1000, EXPRESS ) ; Paso 2: Unload usando el PIPE under root: cat FIFO.dat > /dev/console dbaccess stores - <<EOF insert into ext_customer_fifo select first 10 * from customer; EOF Paso1: Crear el ‘named PIPE’ mkfifo /opt/external/FIFO.dat ls -l /opt/external/FIFO.dat prw-r--r-- 1 informix informix 0 Nov 25 10:17 /opt/external/FIFO.dat © 2009 IBM Corporation IBM Software Group | Information Management Table OPTIONS DATAFILES: DISK, PIPE (FIFO VP), BLOBDIR, CLOBDIR FORMAT: – DELIMTED, – FIXED, – INFORMIX MODE: – EXPRESS (NO BYTE OR TEXT columns), – DELUXE (load ONLY) OTHER: – DBDATE, – DELIMITER, – RECORDEND (delimited format ONLY), – MAXERRORS ( min =1, max: 2,147,483,647), – REJECTFILE, – ESCAPE, – NUMROWS or SIZE © 2009 IBM Corporation IBM Software Group | Information Management Express-mode Express-mode provee el mas alto desempeño durante la carga de datos Express-mode carga datos utilizando ‘light appends’, los cuales hacen ‘bypass’ del buffer pool. Light appends eliminan el overhead associado con el manejo de buffers pero no hacen log de los datos En express-mode, el servidor de bases de datos automaticamente bloquea la tabla en modo exclusivo. Otros usuarios no pueden acceder a la tabla. Si no se utiliza la opcion DELUXE, el servidor de Base de Datos utiliza express-mode al menos que la tabla destino tenga indices o esta sea una tabla de modo STANDARD. © 2009 IBM Corporation IBM Software Group | Information Management Deluxe Mode Deluxe-mode combina cargas fast parallel con evaluation de indexes y unique constraints. Utilice deluxe-mode en las siguientes situaciones: – El costo de reconstruir un indice es demasiado alto para la cantidad de datos que Usted esta cargando. – Se desea utilizar el espacio vacio de filas borradas en la tabla que se esta cargando. La carga de datos con deluxe-mode utiliza un insert regular de una unica fila, el cual adiciona filas a la tabla que puede contener indices. El insert modifica cada indice para cada fila durante la carga. © 2009 IBM Corporation IBM Software Group | Information Management Deluxe mode El insert tambien chequea todos los constraints para cada fila. Cargas con deluxe mode permite mantener la tabla sin locks durante la carga de tal forma que otros usuarios pueden continuar usando la tabla. Se puede utilizar deluxe mode en tablas que no tienen indices; por ejemplo, si se desea tener completa recuperacion de las tablas o mantener acceso a dichas tablas durante la carga. Para preparar una tabla para una carga con deluxe mode, cree la tabla interna del tipo STANDARD y cree la tabla externa con la opcion DELUXE © 2009 IBM Corporation IBM Software Group | Information Management Tablas de catalogo para Tablas Externas Tabla Descripcion sysexternal Almacena informacion extra de cada tabla externa; informacion que no se encuentra presente en systables. sysextdfiles Almacena informacion de los archivos de datos de cada tabla externa; al menos una entrada (un archivo de datos) para cada externa tabla. sysextcols Almacena informacion de las columnas de la tabla externa del formato de tipo FIXED systables Informacion de la tabla externa nrows = MAXINT -1 si NUMROWS no es especificada MAXINT -1 incrementa la selectividad de la tabla para el optimizer © 2009 IBM Corporation IBM Software Group | Information Management Dbinfo() y las Tablas Externas select "tabname: "||trim(tabname)||" is located in dbspace: "|| trim(dbinfo('DBSPACE',partnum)) as location_info from systables where tabname = "toto_delim" location_info tabname: toto_delim is located in dbspace: datadbs © 2009 IBM Corporation IBM Software Group | Information Management Que utilizar y no utilizar en Tablas Externas Data types: Soporta todos los tipos de datos built-in No se puede especificar los tamaños de los extent Indices no son permitidos No tienen una llave primaria o una llave unica No tienen llaves del tipo ‘foreign key constraints’ No se pueden definir triggers No puede ser el destino en una instruccion MERGE Solamente el mas exterior query puede tener referencia a una tabla externa; no referencias a una tabla externa en un subquery No especificar una tabla externa utilizando la instruccion LOAD FROM ... INSERT INTO Tablas externas estan excluidas de Enterprise Replication Solamente una tabla externa en un query © 2009 IBM Corporation IBM Software Group | Information Management Que utilizar y no utilizar en Tablas Externas Una tabla externa no puede ser el ‘outer table’ en un ‘outer join’ UPDATE STATISTICS no es permitido Privilegios diferentes a ‘select’ e ‘insert’ en GRANT y REVOKE no son soportados. UPDATE y DELETE no son soportados en tablas externas ALTER TABLE no es soportado en tablas externas IDS label-based access control (LBAC) no es soportado en tablas externas START VIOLATIONS y STOP VIOLATIONS no son soportados en tablas externas Ciertas operations de High-Availability Cluster no son soportados en tablas externas. © 2009 IBM Corporation IBM Software Group | Information Management Uso de Tablas Externas Carga de datos desde una fuente externa a una tabla interna Descarga de datos desde una tabla a un destino externo Copiar datos desde una fuente externa a un destino externo Utilizando una fuente/destino externo fijo Utilizando una fuente/destino externo delimitada Utilizando una fuente/destino externo informix Leyendo y manipulando datos externos Uniendo una tabla con una tabla externa Convirtiendo un formato fijo a un formato delimitado Convirtiendo un formato fijo o delimitado a un formato XML © 2009 IBM Corporation IBM Software Group | Information Management Herramientas para cargar/descargar datos Cargar Descargar Ventajas Desventajas SQL unload load Facil de usar, ASCII Lenta, No soporta stored procedures, no flexible Command line dbexport dbimport Facil de usar, ASCII Toda la Base de Datos, no flexible dbload Facil de usar, Flexive, ASCII No dbunload Command line Command line onunload onload Rapida No flexible, solo formato informix Command line HPL HPL Rapida,ASCII Requiere preparacion (mas compleja) SQL External table External table Rapida, Flexible, Facil de usar © 2009 IBM Corporation IBM Software Group | Information Management Comparacion de Performance : Carga • Carga con 10 millones de filas en una tabla estandard ( + + , . ! "####### "$% %"&'& ! "####### &"$ )%**& ! "####### ")% *'$*% ! "####### ")$ *-"") ! "####### "$ %&*/"% © 2009 IBM Corporation IBM Software Group | Information Management Comparacion de Performance : Carga • Carga con 10 millones de filas en una tabla RAW ( + + , . 0 "####### "*% *#*#* 0 "####### "'# %%%%% 0 "####### "% ****** 0 "####### "/ -*$&/# 0 "####### "$ %&*/"% © 2009 IBM Corporation IBM Software Group | Information Management Comparacion de Performance : Descarga • Carga con 10 millones de filas en una tabla estandard 1 ! "####### %' "-&)"/ + ! "####### "/ -*$&/# ! "####### ") -")&'% ! "####### &% )##### + , . © 2009 IBM Corporation IBM Software Group | Information Management Comparacion de Performance : Descarga • Carga con 10 millones de filas en una tabla RAW 1 0 "####### %$ "*$)$" + 0 "####### "/ -*$&/# 0 "####### "* *&%### 0 "####### /# ////// + , . © 2009 IBM Corporation IBM Software Group | Information Management Performance : Descargando © 2009 IBM Corporation IBM Software Group | Information Management Performance : Descargando © 2009 IBM Corporation IBM Software Group | Information Management Performance : Cargando © 2009 IBM Corporation IBM Software Group | Information Management Performance : Cargando © 2009 IBM Corporation IBM Software Group | Information Management Performance : Descargando © 2009 IBM Corporation IBM Software Group | Information Management Performance : Descargando © 2009 IBM Corporation IBM Software Group | Information Management Performance : Cargando © 2009 IBM Corporation IBM Software Group | Information Management Performance : Cargando © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y las diferentes herramientas Dbexport Dbimport Ontape/onbar Oncheck Onstat Update statistics Dbaccess : info/status Stored procedures © 2009 IBM Corporation IBM Software Group | Information Management Tables externas y dbexport { TABLE "informix".toto row size = 74 number of columns = 3 index size = 0 } { unload file name = toto_00127.unl number of rows = 10000000 } … { TABLE "informix".toto_delim row size = 74 number of columns = 3 } create external table "informix".toto_delim ( … ) using ( datafiles ( "DISK:/home/informix/khaled/load_perf/u_toto_10M.unl" ), format "delimited", rejectfile "/home/informix/khaled/load_perf/external_toto.rej", maxerrors 400, express ); revoke all on "informix".toto_delim from "public"; grant select on "informix".toto to "public" as "informix"; grant update on "informix".toto to "public" as "informix"; grant insert on "informix".toto to "public" as "informix"; grant delete on "informix".toto to "public" as "informix"; grant index on "informix".toto to "public" as "informix"; grant select on "informix".toto_delim to "public"; grant insert on "informix".toto_delim to "public"; © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y dbimport { TABLE "informix".toto row size = 74 number of columns = 3 index size = 0 } { unload file name = toto_00127.unl number of rows = 10000000 } … { TABLE "informix".toto_delim row size = 74 number of columns = 3 } create external table "informix".toto_delim ( … ) using ( datafiles ( "DISK:/home/informix/khaled/load_perf/u_toto_10M.unl" ), format "delimited", rejectfile "/home/informix/khaled/load_perf/external_toto.rej", maxerrors 400, express ); revoke all on "informix".toto_delim from "public"; grant select on "informix".toto to "public" as "informix"; grant update on "informix".toto to "public" as "informix"; grant insert on "informix".toto to "public" as "informix"; grant delete on "informix".toto to "public" as "informix"; grant index on "informix".toto to "public" as "informix"; grant select on "informix".toto_delim to "public"; grant insert on "informix".toto_delim to "public"; © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y el backup con ontape/OnBar El backup contiene los dbspaces/chunks incluyendo el tblspace(1 extent de 8 paginas) representando la tabla externa PERO no los datos almacenados en el archivo externo en el cual esta basada la tabla externa Se debe hacer backup de los archivs externos ya que ontape/OnBar no hacen backup de ellos © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y oncheck TBLspace Report for load:informix.toto_delim Physical Address 2:517 Creation date 01/14/2010 15:09:33 TBLspace Flags 801 Page Locking TBLspace use 4 bit bit-maps Maximum row size 1 … First extent size 8 Next extent size 8 Number of pages allocated 8 Number of pages used 1 Number of data pages 0 Number of rows 0 … TBLspace Usage Report for load:informix.toto_delim Type Pages Empty Semi-Full Full Very-Full ------------------------- ---------- ------------------- ---------Free 7 Bit-Map 1 Index 0 Data (Home) 0 ---------Total Pages 8 Considerada como una tabla vacia ya que el chequeo es hecho en el contenido del tblspace © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y Update Statistics UPDATE STATISTICS FOR TABLE <external table> – 26191: Incorrect use of an external table informix.toto_fixed in query. NO update statistics on external tables © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y dbaccess/info Dbaccess/table/info/status – El conteo de filas es hecho leyendo el archivo externo secuencialmente © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas en Stored Procedures CREATE PROCEDURE p_load_data (p_table char(30)) DEFINE i INT; DEFINE v_table char(30); INSERT INTO customer SELECT * FROM ext_customer; LET v_string=“INSERT INTO ”||trim(p_table); LET v_string=v_string||” SELECT * FROM ext_”||trim(p_table); EXECUTE IMMEDIATE v_string; END PROCEDURE; © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y XML Se puede utilizar el poder de funciones XML en el motor de IDS en archivos externos execute function genxmlqueryhdr ('clients', 'select first 2 col1*10000 as amount ,col2 name from clients_fixed'); (expression) <?xml version="1.0" encoding="en_US.819" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <clients> <row> <amount>10000.0000000000</amount> <name>khaled </name> </row> <row> <amount>20000.0000000000</amount> <name>khaled </name> </row> </clients> © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas y concurrencia Se bloquea la tabla externa en modo exclusivo cuando es accesada SOLO un usuario puede leer una tabla externa a la vez si la Base de Datos esta en NO LOGGING MODE Si la tabla externa esta abierta, se genera el siguiente error: 26152: Could not exclusively lock external table. 113: ISAM error: the file is locked. © 2009 IBM Corporation IBM Software Group | Information Management Monitoreando tablas externas Ejecute onstat -g sql para obtener el numero de sesion Ejecute onstat -g pqs <ses_id> para obtener el numero de filas procesadas Ejecute onstat –t Ejecute onstat –g iof Ejecute onstat –g ioq Monitoreando FIFO VPs – Ejecute onmode –g ioq para observar la longitud de la cola FIFO esperando por I/O – Si totalops no se esta incrementando, esto significa que la operacion de lectura o escritura sobre un archivo o pipe esta detenido (porque los VPs de FIFO estan ocupados) Incremente el numero de VPs © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas en un cluster (HA) SOLO el esquema de la tabla externa es creado en el servidor PRIMARIO y replicado a los servidores secundarios Primario: – Load – Unload Secundario (RSS, HDR, SDS): – Unload a archivos locales en el servidor secundarios – NO LOAD Los archivos de la tabla externa creados en el servidor secundario no son automaticamente transferidos al servidor primario ni los archivos creados en el servidor primario son automaticamente transferidos a los servidores secundarios. © 2009 IBM Corporation IBM Software Group | Information Management Tablas externas en un cluster (HA) Sincronizacion de tablas externas entre el Primario y Secundario: – Copia del archivo de la tabla externa del servidor primario al secundario o – Primario: • Cree una tabla temporal con el mismo esquema de la tabla externa • INSERT INTO temp_table SELECT * FROM ext_table – Secondary: • INSERT INTO ext_table FROM remp_table © 2009 IBM Corporation IBM Software Group | Information Management Reversion de una version Si una nueva tabla externa fue creada, se debe borrar antes de revertir de version. (Las tablas de catalogo SYSEXTERNAL, SYSEXTCOLS, y SYSEXTDFILES seran borradas durante ell proceso de reversion.) © 2009 IBM Corporation IBM Software Group | Information Management Tablas Externas : Errores REJECT FILES (load) – MAXERRORS: – Archivos de Reject son removidos al comienzo del load si errores ocurren – Entradas en archivos Reject son de lineas unicas con los siguientes campos separados por coma: filename, record, reason-code, fieldname: bad-line – CONSTRAINT constraint name, CONVERT_ERR, MISSING_DELIMITER, MISSING_RECORDEND, NOT NULL, ROW_TOO_LONG (longer than 64K) Mensajes de error en tablas externas – ERRORS: -26151 to -26199 and -615, -999, -23852, and -23855 Recuperacion – Tablas RAW: • Si el server genera un crash durante la carga, los datos cargados NO son ‘Rolled Back’ (la tabla queda en un estado desconocido ‘unknow state’) – Tablas STANDARD : • DELUXE: OK • EXPRESS: Revierte al Backup Nivel 0 previo © 2009 IBM Corporation IBM Software Group | Information Management GRACIAS!! Tablas Externas Informix Dynamic Server 11.50.xC6 Edgar D. Sanchez e-mail: edgarsan@us.ibm.com Informix Advanced Support IBM © 2009 IBM Corporation