Borrado Masivo de datos en Oracle usando particiones
Borrar datos masívamente usando un comando delete afecta los recursos de la base de datos.
Si los borrados masivos son frecuentes en tu sistema, es mejor que organices tus tablas para que puedan soportar este comportamiento.
Puedes investigar mas sobre particiones en Oracle y las diferentes particiones que se pueden aplicar, en esta ocasión recomiendo las particiones por lista horizontales.
Ejemplo:
las particiones son para manejar grandes volúmenes de datos, pero para explicar mejor presento una tabla con pocos datos.
Tabla tblRevisiones:
Tenemos una tabla que nos interesa borrar todos los datos que pertenecen a una dicha revisión es decir, la rev1, rev2, rev3 o cualquier otra revisión que pudiera existir.
Lo que hacemos en este caso es preparar la tabla para que almacene todos los registros rev1 en una partición, todos los rev2 en otra partición, todos los rev3 en otra partición y que pueda crear automáticamente otras particiones cuando se ingresen nuevas revisiones:
Paritción rev1
Partición rev2:
Particion rev3:
De esta manera, cuando necesitemos borrar todos los registros que pertencen a la rev1 por ejemplo será suficiente con el comando:
ALTER TABLE tblRevisiones TRUNCATE PARTITION rev1
Esto eliminará todos los registros que pertenecen a rev1 de manera inmediata, utilizando muy pocos recursos de la base de datos.
Crear Tabla Particionada
CREATE TABLE tblRevisiones (
revision VARCHAR2(30),
codigo VARCHAR2(30),
dato1 VARCHAR2(30),
dato2 NUMBER
)
PARTITION BY LIST (revision)
(
PARTITION rev1 VALUES ('rev1'),
PARTITION rev2 VALUES ('rev2'),
PARTITION rev3 VALUES ('rev3'),
PARTITION ERR VALUES (null)
);
De esta manera cuando se inserten registros, automáticamente se insertarán en la partición correspondiente según el valor de la revisión que contenga cada registro.
Crear Particiones de manera dinámica
vs_tabla := 'tblRevisiones';
vs_Particion := 'rev1';
vn_existe_particion := 0;
SELECT count(1)
INTO vn_existe_particion
FROM ALL_TAB_PARTITIONS
WHERE TABLE_NAME = vs_table
AND PARTITION_NAME = vs_Particion;
IF vn_existe_particion = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE tblRevisiones ADD PARTITION '
||vs_Partition
||' VALUES('''||vs_Partition||''')';
--ELSE
-- EXECUTE IMMEDIATE 'ALTER TABLE tblRevisiones TRUNCATE PARTITION '
-- || vs_Particion
END IF;
/* CONTINUAR CON EL PROCEDIMIENTO DE INSERTAR */
El ELSE que está comentado serviría para truncar la partición antes de insertar, pero si no se necesita entonces se hará la inserción normal, agregando registros a la partición correspondiente
El truncado solo se puede hacer si la partición existe, por eso va dentro de un ELSE.
Saludos a Yadir Rivera y Norman Hernández, espero les sea de utilidad
No hay comentarios:
Publicar un comentario