viernes, 22 de febrero de 2008

Direct Load Insert

Direct Load Insert

El buen desempeño de las aplicaciones siempre es uno de los requerimientos de toda base de datos. ¿Quiere un tip que bien aplicado puede mejorar en 6 o mas veces el desempeño? ; pues lea detenidamente las siguientes líneas.

El caso que les expongo corresponde a la mejora de inserts masivos a una tabla como es la transferencia de información entre bases de datos o aplicaciones. Recientemente usamos esta técnica para reducir el tiempo de parada en una migración de la base de datos de un servidor a otro.

Con el método tradicional de export e import el proceso tardaba cerca de un día y medio, tiempo inaceptable para cualquier institución que busque brindar un buen servicio a sus usuarios. Usando la técnica de inserts con direct load, el proceso de inserción de información se redujo a 31 minutos.


Cuánta información?
Cerca de 70Gb solo de datos. El proceso completo estuvo por debajo de las 5 horas debido a los índices, estadísticas y otros objetos como vistas materializadas.

Cómo funciona?
Los insert tradicionales desarrollan un proceso de búsqueda de espacio para el registro correspondiente. Además escriben tanto a los redologs como a los undo segments.La técnica de inserts con direct load por lo contrario, reduce el proceso a su más mínima expresión.

Cuál?
Construir el bloque en memoria y escribirlo directo al disco. A los redologs y undo segments sólo se escribe la información del diccionario de datos correspondiente a la administración del espacio; eso en la práctica es nada.

Cómo se hace?
Se usa la técnica de hints. Estos son comentarios que se ponen sobre las sentencias SQL, los cuales son interpretados por el optimizador para realizar la tarea correspondiente de una forma distinta a la convencional. Tienen muchos usos como paralelizar, forzar el uso de índices, cambiar el orden de un join, etc.

En particular, para forzar el uso de direct load use el siguiente hint: /*+ append */

Ejemplo:

Su aplicación carga información diariamente de la base de datos transaccional al datawarehouse así:

insert into ventas

select * from detalle_facturas@oltp where fecha_venta > sysdate - 1

Para hacer que dicha inserción se realice tipo direct load, cambie el insert a:

insert /*+ append */ into ventas

nologging

select * from detalle_facturas@oltp where fecha_venta > sysdate - 1

Resultado: su carga de datos se redujo en tiempo a la sexta parte o menos.

Esta técnica con lleva algunos cuidados que es importante de comprender antes de ponerla en producción.


Si desea conocer de ellos, por favor contáctenos : contacto@red-partner.com


Estaremos gustosos de atenderles.

Martín Cabarique



No hay comentarios.: