sábado, 8 de noviembre de 2025

Oracle Ai Database 26ai: Tablas con atributo STAGING

Una de las nuevas características de Oracle 26ai en Autonomous Database, son las tablas con atributo de STAGING.

Oracle indica que esta nueva versión admite este tipo de tablas de almacenamiento provisional, optimizadas para carga de datos en un servidor de tipo LAKEHOUSE.

Hasta la versión 23ai de Autonomous, teníamos de 4 tipos de bases de datos según su carga de trabajo:
        1. ADW ( Data Warehouse)
        2. ATP (Transaction Processing), DEFAULT
        3. JSON ( Utilización de datos tipos JSON
        4. APEX Service
En la versión 26ai, se le agrega el 5 tipo: LAKEHOUSE y es el nuevo tipo DEFAULT de despliegue de Autonomous Database 26ai.

El concepto de Lakehouse lo podemos simplificar diciendo que  es una plataforma que combina lo mejor de un Data Lake y un Data Warehouse en un mismo entorno.

Lakehouse, te va permitir almacenar grandes volúmenes de datos sin estructura como en un Data Lake, pero con capacidades de análisis, seguridad y gobernanza de un Data Warehouse. Así los datos pueden ser almacenados en bruto, transformados y consultados con el lenguaje SQL o incluso con la utilización de IA desde el mismo lugar.

Un dato importante, es que esta tecnología permite usar transacciones ACID sobre los datos en el Datalake, utilizando Apache Iceberg.

Ahora volviendo sobre como iniciamos esta conversación, las tablas de atributo STAGING tiene ciertas características interesantes que describe la documentación de Oracle textualmente:
  • Se ha desactivado explícitamente cualquier tipo de compresión en la tabla de almacenamiento provisional para cualquier carga de datos. El comando ALTER TABLE COMPRESS no está permitido.
  • Modificar el atributo de STAGING en una tabla existente no afecta al almacenamiento de los datos existentes, pero sí a las futuras cargas de datos.
  • La base de datos de IA autónoma utiliza un muestreo dinámico para las estadísticas de las tablas con la propiedad de almacenamiento provisional establecida, y no recopila estadísticas sobre las tablas de almacenamiento provisional.
  • Al eliminar las tablas provisionales las borra inmediatamente, sin pasar por la papelera de reciclaje. Establecer el parámetro de recyclebin de inicialización en el valor ON, no habilita la papelera de reciclaje.
  • Cualquier forma de compresión está explícitamente desactivada y prohibida en todas las particiones y subparticiones de la tabla.
  • No se pueden cambiar los atributos predeterminados de la tabla para usar la compresión con ALTER TABLE MODIFY DEFAULT ATTRIBUTES.
  • No se pueden realizar operaciones de mantenimiento de particiones que muevan y compriman datos. Por ejemplo, al intentar aplicar compresión, no se permiten las siguientes opciones: ALTER TABLEcon MOVE PARTITION, MERGE PARTITIONS, SPLIT PARTITION, o SPLIT SUBPARTITION.
  • No se puede volver a particionar una tabla ALTER TABLE MODIFY PARTITION y especificar que alguna partición resultante se vaya a comprimir.
Realicé un pequeño testing inicial, para validar si realmente existe beneficio en el uso de tablas con el atributo de STAGING y obtuve como resultado lo siguiente:
  1. Efectivamente al crear la tabla con el atributo y borrarla, no paso por la papelera de reciclaje, podemos poner check a este punto.
  2. En carga de 2 millones de registros a través de una ciclo con la generación de data aleatoria, no existió variación importante entre la carga de la tabla con STAGING y una normal. No check para este punto.
  3. Al actualizar datos directamente sobre la tabla STAGING, registre una mejoría del 12% en el tiempo empleado contra una tabla normal. Aquí también podemos poner check.
  4. Al realizar consultas sobre la tabla con el atributo STAGING y la normal, la base de datos Oracle AI Database 26ai, si coloca de una los datos en RESULT CACHE, como lo indica la documentación inicial. Check aquí también.
En resumen, al parecer si existen mejoras importantes con operaciones simples tipo DML sobre las tablas con el atributo STAGING. Tenemos que seguir investigando un poco más sobre el empledo de IA como fuente de repositorio de datos para entrenamiento de modelos de entrenamiento, pero sobre esto les brindará más informacion más adelante.

Pueden ver el contenido de lo utilizado en el laboratorio, a continuación.
select * from v$version;
Oracle AI Database 26ai Enterprise Edition Release 23.26.0.1.0 - for 
Oracle Cloud and Engineered Systems


CREATE TABLE part_staging_table_normal (col1 number, col2 varchar2(100))
    PARTITION BY RANGE (col1)
          (PARTITION p1 VALUES LESS THAN (100), 
           PARTITION pmax VALUES LESS THAN (MAXVALUE));
           
CREATE TABLE part_staging_table (col1 number, col2 varchar2(100))
    PARTITION BY RANGE (col1)
          (PARTITION p1 VALUES LESS THAN (100), 
           PARTITION pmax VALUES LESS THAN (MAXVALUE)) FOR STAGING; 
           
begin
for i in 1 .. 1000000 loop
insert into part_staging_table
values (DBMS_RANDOM.VALUE(1, 100), dbms_random.string('P',trunc(dbms_random.value(50,99))));
end loop;
for i in 1 .. 1000000 loop
insert into part_staging_table
values (DBMS_RANDOM.VALUE(50,200), dbms_random.string('P',trunc(dbms_random.value(50,99))));
end loop;
commit;
end;
/

begin
for i in 1 .. 1000000 loop
insert into part_staging_table_normal
values (DBMS_RANDOM.VALUE(1, 100), dbms_random.string('P',trunc(dbms_random.value(50,99))));
end loop;
for i in 1 .. 1000000 loop
insert into part_staging_table_normal
values (DBMS_RANDOM.VALUE(50,200), dbms_random.string('P',trunc(dbms_random.value(50,99))));
end loop;
commit;
end;
/
select count(*) from PART_STAGING_TABLE
where col1 < 100;




drop table PART_STAGING_TABLE_NORMAL select count(*) from PART_STAGING_TABLE_NORMAL where col1 < 100;
drop table PART_STAGING_TABLE
show recyclebin;
create table part_tx_table (col1 number, col2 varchar2(100)) PARTITION BY RANGE (col1) (PARTITION p1 VALUES LESS THAN (100), PARTITION pmax VALUES LESS THAN (MAXVALUE)); create table part_tx_table2 (col1 number, col2 varchar2(100)) PARTITION BY RANGE (col1) (PARTITION p1 VALUES LESS THAN (100), PARTITION pmax VALUES LESS THAN (MAXVALUE)); ## Actualización en tabla sin claúsula STAGING
update part_staging_table_normal
set col2=dbms_random.string('P',trunc(dbms_random.value(20,99)))
where col1 < 50;

494,143 rows updated.

Elapsed: 00:00:18.287

## Actualización en tabla con claúsula STAGING
update part_staging_table set col2=dbms_random.string('P',trunc(dbms_random.value(20,99))) where col1 < 50; 494,637 rows updated. Elapsed: 00:00:16.220 insert into part_tx_table select * from part_staging_table; 2,000,000 rows inserted. Elapsed: 00:00:02.720 insert into part_tx_table2 select * from part_staging_table_normal; 2,000,000 rows inserted. Elapsed: 00:00:02.673

No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM