[ 2018-12-26 ]

Oracle 18c: Como hacer un MERGE ONLINE de Particiones y Subparticiones

A partir de Oracle 18c tenemos la posibilidad de realizar un MERGE de manera ONLINE de particiones (y subparticiones) cuando estamos utilizando el feature de "Partitioning".
Veamos un ejemplo de como hacerlo:

Primero creamos una tabla para la demostración:
La table tiene tres columnas, una de ellas del tipo fecha particionada por rangos (BY RANGE)

create table vtas
(
nro_fc number,
fecha_vta date,
precio number
)
partition BY RANGE (fecha_vta)
(
partition vtas_q1_16 values less than (TO_DATE('01-APR-2016', 'DD-MON-YYYY')),
partition vtas_q2_16 values less than (TO_DATE('01-JUL-2016', 'DD-MON-YYYY')),
partition vtas_q3_16 values less than (TO_DATE('01-OCT-2016', 'DD-MON-YYYY')),
partition vtas_q4_16 values less than (TO_DATE('01-JAN-2017', 'DD-MON-YYYY')),
partition vtas_q1_17 values less than (TO_DATE('01-APR-2017', 'DD-MON-YYYY')),
partition vtas_q2_17 values less than (TO_DATE('01-JUL-2017', 'DD-MON-YYYY')),
partition vtas_q3_17 values less than (TO_DATE('01-OCT-2017', 'DD-MON-YYYY')),
partition vtas_q4_17 values less than (TO_DATE('01-JAN-2018', 'DD-MON-YYYY')),
partition vtas_futuro values less than (TO_DATE('01-JAN-2020', 'DD-MON-YYYY'))
)
ENABLE ROW MOVEMENT
/

Insertamos algunos datos y calculamos estadísticas:

exec DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SDALESSA', TABNAME=>'VTAS', ESTIMATE_PERCENT=>DBMS_STATS.AUTO_SAMPLE_SIZE, CASCADE=> TRUE, METHOD_OPT=> 'FOR ALL COLUMNS SIZE 1', GRANULARITY=>'ALL');

En una sesión nueva SESS1.
Verificamos, nombre de partición, posición, intervalo y valor más alto.

SESS1:
select table_name, partition_name, partition_position, interval, high_value
from user_tab_partitions
where table_name='VTAS' order by table_name, partition_position;

Realizamos el "merge" online de dos particiones:

alter table vtas merge partitions vtas_q1_16, vtas_q2_16 into partition vtas_q2_16 online;

En otra sesión SESS2.
Ejecutamos un update de la tabla

SESS2:
update vtas
set fecha_vta = '01-JUN-16'
where nro_fc = 116;
commit;

Volvemos a la SESS1 y verificamos si el "merge" fué realizado con éxito. Comprobamos también el rango de particionamiento.

SESS1:
select table_name, partition_name, partition_position, interval, high_value
from user_tab_partitions
where table_name='VTAS'
order by table_name, partition_position;


Con esta nueva funcionalidad podemos subir todavía más los niveles de disponibilidad de nuestras bases de datos.

No hay comentarios:

Publicar un comentario