Hola a todos, hoy vamos a enseñaros cómo crear particiones por lista de una tabla. Así como la creación de índices en este tipo de tablas en Oracle. Para este escenario tenemos una tabla existente con muchos datos, la idea es particionarla y también a sus índices para mejorar el rendimiento de la tabla. Como muchos sabemos el particionamiento solo está disponible en la Enterprise Edition de Oracle y no esta disponible para SE o Express Edition. El particionamiento permite subdividir una tabla, un índice en partes más pequeñas, facilitan la administración y la consulta de los datos. Al dividir una tabla grande en particiones más pequeñas, puede mejorar el rendimiento de las consultas y controlar los costos al reducir la cantidad de bytes leídos por una consulta.
Cómo Crear una Partición por Lista en Oracle
Para iniciar debemos saber que es una tabla existente y tiene millones de registros que están en un solo tablespace. Si no conocemos la tabla debemos ejecutar un DESC a la tabla para ver por donde podemos particionar la tabla.
Antes de empezar, deberemos realizar un backup del schema o de la tabla a particionar. Adicionalmente, recomendamos realizar el particionado en horario de baja actividad para afectar lo menos posible a los usuarios.
SQL> DESC TELEFONIA.LLAMADA_DIARIA;
Nombre ¿Nulo? Tipo
----------------------------------------- -------- ----------------------------
NUM_LLAMANTE NOT NULL VARCHAR2(30)
NUM_LLAMADO NOT NULL VARCHAR2(30)
FEC_INILLAMADA NOT NULL DATE
TIE_INILLAMADA NOT NULL VARCHAR2(6)
DUR_LLAMADA NOT NULL VARCHAR2(6)
COD_PERIODO NOT NULL NUMBER(6)
SQL>
Preparación y Creación de Tablespaces
Para tener nuestras particiones más ordenas crearemos varios tablespaces ordenados por años, y crearemos 1 Tablespaces para solo la tabla LLAMADA para los días del año actual y futuro. De esta forma podemos mantener un orden también tendríamos la opción de colocar los tablespaces de especificados por años dejándolos en READ ONLY
Debes de pensar que estas particiones solo esta hasta el 2025 entonces a futuro deberás de crear las particiones del 2026, etc.
SQL> CREATE TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA_2023" DATAFILE '+DATA' SIZE 1073741824
AUTOEXTEND ON NEXT 1048576 MAXSIZE 30720M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO;
Tablespace creado.
SQL> CREATE TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA_2024" DATAFILE '+DATA' SIZE 1073741824
AUTOEXTEND ON NEXT 1048576 MAXSIZE 30720M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO;
Tablespace creado.
SQL> CREATE TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA_2025" DATAFILE '+DATA' SIZE 1073741824
AUTOEXTEND ON NEXT 1048576 MAXSIZE 30720M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO;
Tablespace creado.

Modificar la Tabla y Crear Índices Particionados
Ejecutaremos un Alter para modificar la tabla actual, donde le diremos que nos particione la tabla por la columna COD_PERIODO y de esta forma quedará particionada nuestra tabla por lista.
El comando nos queda de la siguiente manera: Tendremos los periodos agrupados por años hasta agosto 2024 el resto de los meses siguientes quedaran en la partición de las tablas particionados por el COD_PERIODO también dejaremos creado las particiones del resto del 2024 y 2025. También puede crear muchos más años.
Es importante monitorear los TABLESPACES, al crear la partición se te puede llenar y deberá agregar un nuevo Datafile.
ALTER TABLE "TELEFONIA"."LLAMADA" MODIFY PARTITION BY list ("LLAMADA_DIARIA")
(PARTITION "2023" VALUES (10123,10223,10323,10423,10523,10623,10723,10823,10923,11023,11123,11223) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA_2023",
PARTITION "2024" VALUES (10124,10224,10324,10424,10524,10624,10724,10824) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA_2024",
PARTITION "10924" VALUES (10924) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11024" VALUES (11024) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11124" VALUES (11124) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11224" VALUES (11224) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10125" VALUES (10125) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10225" VALUES (10225) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10325" VALUES (10325) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10425" VALUES (10425) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10525" VALUES (10525) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10625" VALUES (10625) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10725" VALUES (10725) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10825" VALUES (10825) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10925" VALUES (10925) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11025" VALUES (11025) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11125" VALUES (11125) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11225" VALUES (11225) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "CICLO_UNKNOWN" VALUES (DEFAULT) TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA"
)
ONLINE;
Tabla modificada.
Si tenemos índices existentes debemos borrarlos ejecutando de DROP INDEX a todos los índices que tengamos para crear los nuevos especificando las particiones creadas, para esta caso daremos un ejemplo de cómo hacerlo.
CREATE INDEX "TELEFONIA"."INX_LLAMADA_001" ON "TELEFONIA"."LLAMADA" ("DUR_LLAMADA","COD_PERIODO")
LOCAL
(
PARTITION "2023" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA_2023",
PARTITION "2024" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA_2024",
PARTITION "10924" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11024" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11124" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11224" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10125" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10225" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10325" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10425" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10525" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10625" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10725" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10825" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "10925" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11025" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11125" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "11225" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA",
PARTITION "CICLO_UNKNOWN" TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA")
TABLESPACE "TBS_LLAMADA_DIARIA_TELEFONIA";
Índice creado.
Esperemos que esta entrada os haya servido de ayuda. Si queréis que analicemos vuestro caso, para ver si es posible realizar particionamiento, o es mejor optar por otras alternativas, contactad con nosotros sin compromiso. Somos expertos en bases de datos Oracle.
¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.
Sígue a GPS en LinkedIn
