Oracle Database 12c: Nuevas Características de "Oracle Partitioning"

Por Joel Pérez & Mahir M. Quluzade (OCP)
Publicado en Julio 2014

Reciban estimados tecnólogos Oracle un cordial saludo. A través del presente artículo, tendremos la oportunidad de visualizar y adentrarnos un poco en el tema de las nuevas características de “Oracle Partitioning” en “Oracle Database 12c”.

“Oracle Partitioning”: mejora el rendimiento, capacidad de administración y la disponibilidad de una amplia variedad de aplicaciones. Ayuda a reducir el coste total de propiedad para el almacenamiento de grandes cantidades de datos. “Oracle Partitioning” permite que las tablas, índices y tablas de índice-organizado “Index-Organized Tables” para ser subdivididas en partes más pequeñas denominadas “particiones”, lo que permite que estos objetos de base de datos puedan ser gestionados y accedidos a un nivel más fino de granularidad. Cada partición posee un nombre propio y pueden poseer características de almacenamiento particulares. Oracle ofrece una rica variedad de estrategias de Particionado para hacer frente a todas las necesidades de negocio. Por otra parte, el particionado es completamente transparente para casi cualquier aplicación sin la necesidad de cambios en las mismas. En base a esto se podría mencionar que “Oracle Partitioning” impacta de forma positiva las siguientes aéreas:

  • Rendimiento
  • Capacidad de Administración
  • Reducción de Costo de Almacenamiento
  • Granularidad mas fina en el acceso

“Oracle Partitioning” esta direccionado para soportar actividades de tablas e índices de gran tamaño, generalmente contenidas en “BBDDs” de gran tamaño “Very Large Databases (VLDB)” las cuales generalmente están compuestas de cientos de “Gigabytes” o “TeraBytes”.

Perspectiva de “Oracle Partitioning” para un DBA y/o Aplicaciones
Desde la perspectiva de un administrador de base de datos, un objeto particionado posee múltiples piezas que se pueden administrar ya sea colectiva o individualmente. Esto le da al administrador una gran flexibilidad en el manejo de las mismas. Sin embargo, desde la perspectiva de la aplicación, una tabla con particiones es idéntica a una tabla sin particiones; no es necesario realizar modificaciones al acceder a una tabla con particiones “SQL Statements” o “DMLs”.

Ilustración del concepto esencial de particionamiento.

Partitioning Key
Cada fila de una tabla con particiones está inequívocamente asignada a una sola partición. La clave de partición está compuesta de una o más columnas que determinan la partición donde se almacenará cada fila. El manejador dirige automáticamente las operaciones de inserción, borrado y actualización  a la partición adecuada mediante el uso de la clave de particionado.
Cualquier tabla pudiese ser dividida en un millón de particiones salvo en los casos de tablas que contienen columnas con tipos de datos LONG RAW o LONG. Puede, sin embargo, utilizar particionado en tablas que contienen columnas con tipos de datos CLOB o BLOB.

Cuando particionar una tabla ?

  • Tamaño: Tablas de más de 2 GB siempre deben ser consideradas como candidatas para el particionado.
  • Datos Históricos: Las tablas que contienen datos históricos, en los que los nuevos datos se añaden a una nueva partición. Un ejemplo típico podría ser una tabla histórica en la que solo los datos del mes actual fuesen actualizables y los otros 11 meses fuesen de solo lectura.
  • Distribución de Almacenamiento: Cuando el contenido de una tabla posea la necesidad de ser distribuida a través de diferentes tipos de dispositivos de almacenamiento.

Cuando particionar un Índice ?

  • Reconstrucción de Índice: Para evitar la reconstrucción de todo el índice cuando se extrae de datos
  • Seccionar Mantenimiento: Para realizar el mantenimiento de particiones de datos sin invalidar todo el índice
  •  Reducir Impacto de Asimetría: Para reducir el impacto de asimetría de índice causada por datos en una columna con un valor monótonamente creciente

Estrategias de “Oracle Partitioning”
“Oracle Partitioning” ofrece tres métodos de distribución fundamental de datos como estrategias básicas de particionamiento las cuales controlan cómo los datos se colocan en las particiones individuales. Los diversos tipos son los siguientes:

  • Range: “Range Partitioning” direcciona data a las particiones basado en rangos de valores de la clave de particionamiento, la cual es establecida para cada partición. Es el tipo más común de la partición y se utiliza a menudo para fechas. Un ejemplo podría ser un campo con clave de particionamiento establecida en base a un rango de fechas como el siguiente: 01-oct-2014 al 31-oct-2014.
  • Hash: “Hash Partitioning” direcciona la data a particiones basado en un algoritmo hash que Oracle aplica a la clave de partición que se ha identificado. El algoritmo de “hashing” distribuye de manera uniforme las filas entre las particiones, procurando que las mismas se mantengan en un nivel promedio al mismo tamaño. “Hash Partitioning” es un método ideal para la distribución de datos de manera uniforme a través de dispositivos.
  • List: “List Partitioning” le permite controlar explícitamente asignar registros a particiones especificando una lista de valores discretos para la clave de partición en la descripción de cada partición. La ventaja de la lista de particiones es que se pueden agrupar y organizar listas no ordenadas y sin relación de datos de una manera natural. Para ver una tabla con una columna de la región como la clave de partición, la partición de Asia podría contener valores de Singapur, Malasia y Tailandia.

“Global Indexes” & “Local Indexes”
En “Oracle Partitioning” existen dos tipos de Índices: Índices globales y locales. La diferencia entre ellos estriba en que los índices locales pertenecen a una relación uno a uno entre índice y partición. Los índices globales poseen una relación posible de uno a muchos respecto a que un índice puede estar creado para atender/abarcar diversas particiones. Los índices globales a su vez pueden ser creados bajo método “Range” o “Hash”.

Ejemplo grafico de la distribución conceptual de Índices locales:

Ejemplo grafico de la distribución conceptual de Índices Globales:

Una vez finalizado todo lo necesario para entender las nuevas características de “Oracle Partitioning” en “12c”. Procedamos a conversar de los diversos puntos del tema.

“Online Move Partition” & “New Compression Types for Tables”
Previo a “Oracle Database 12c” el tema relacionado con la reorganización de tablas, particiones y sub-particiones era un área que requería previsiones, planificaciones y puestas en marchas de estrategias para evitar altas contenciones a causa de operaciones “DML” paralelas a la reorganización.
A partir de “Oracle Database 12c” la reorganización de tablas, particiones y sub-particiones paso a convertirse en una operación menos elaborada en su planificación al poder contar con la clausula “ONLINE” la cual permite operaciones “DML” sin interrupción.
Esta nueva funcionalidad puede ser utilizada para:

  • Mover particiones y sub-particiones de un “storage” a otro:. De “Filesystems” a “+ASM” & viceversa, de “storages” rápidos a lentos, entre “filesystems” pertenecientes a “SANs” distintas, en si, entre cualquier linea de “storage” disponible para almacenamiento habilitada para la BBDD.
  • Mover particiones y sub-particiones a “storage” de bajo costo: una vez que estas se han tornado en particiones no accedidas con alta frecuencia, dichos cambios se pudiesen llevar a cabo “On Demand” o producto de la evaluación y acción de políticas “ADO” ( Automatic Data Optimization ). “ADO” representa un mecanismo de ejecución para mover o comprimir tablas, particiones y sub-particiones de acuerdo a políticas construidas bajo este mecanismo. Las políticas de “ADO” están basadas en análisis de estadísticas de uso de objetos a través del mecanismo de “Heat Map”.
  • Comprimir particiones y sub-particiones de acuerdo a políticas “ADO”

Beneficios:

  • “DML” permitidos en vivo
  • Realización de “Move”,”Split” o “Merge” “ONLINE” de particiones y sub-particiones a determinados “tablespaces”
  •  Durante la ejecución los índices Globales y Locales son mantenidos de forma automática, los tradicionales “Index Rebuild” manuales ya no son requeridos.


 SQL2> ALTER TABLE ORDERS

   2  MOVE PARTITION ORD_P1
   3  TABLESPACE lowtbs
   4  UPDATE INDEXES ONLINE;


Tipos de Compresiones de Tablas en “Oracle Database 12c”

La Clausula “MOVE” es el vehículo típico para comprimir segmentos. Los tipos soportados se clasifican en modo macro en:

  • BASIC
  • OLTP
  • HCC ( “Hybrid Columnar Compression” )

ROW STORE COMPRESS BASIC/ADVANCED: se utiliza para las filas insertadas sin el uso de “direct-path insert” utilizando la opción “Advanced Compression Option (ACO)” . ROW STORE COMPRESS ADVANCED es la nueva sintaxis utilizada con la función "Advanced Row Compresión" , este es el nuevo nombre para el antiguo “OLTP Table compression feature” parte de “ACO”.

COLUMN STORE COMPRESS FOR QUERY LOW/HIGH: provee un nivel más alto de compresión respecto a “ROW STORE COMPRESS”. Trabaja de forma excelente con cargas de trabajos criticas, frecuentes consultas y un grado de operaciones no tan altas como para las que esta diseñada “ROW STORE COMPRESS” .

COLUMN STORE COMPRESS FOR ARCHIVE LOW/ARCHIVE HIGH: posee el nivel mas alto de compresión y esta adecuado para el acceso de data infrecuente, para esta configuración el perfil adecuado esta basado en que la data permanezca mayormente en modo “read only”.


ROW STORE COMPRESS [BASIC]

SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
2        ROW STORE COMPRESS
3 UPDATE INDEXES ONLINE;


ROW STORE COMPRESS ADVANCED
SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
  2        ROW STORE COMPRESS ADVANCED
  3        UPDATE INDEXES ONLINE;


SQL> ALTER TABLE ventas
MOVE PARTITION ventas_2000
2          COMPRESS FOR OLTP
3          UPDATE INDEXES ONLINE;


COLUMN STORE COMPRESS
SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
2          COLUMN STORE COMPRESS FOR QUERY HIGH
3          UPDATE INDEXES ONLINE;


COLUMN STORE COMPRESS
SQL> ALTER TABLE ORDERS MOVE PARTITION ORD_P1
  2        COLUMN STORE COMPRESS FOR ARCHIVE HIGH
  3        UPDATE INDEXES ONLINE;


“Interval Reference Partitioning”

“Interval Partitioning” es una extensión de “Range Partitioning” la cual instruye a la base de datos a crear automáticamente particiones de un intervalo especificado cuando los datos insertados en la tabla supera los valores de los datos existentes. Se debe especificar al menos un rango de partición. El valor del “Key Partitioning” determina el alto valor de las particiones de rango, este se llama el punto de transición “Transition Point”. La base de datos crea particiones de intervalo de datos más allá de ese punto de transición. El límite inferior de cada partición de intervalos es el límite superior no inclusiva de la gama anterior o partición de intervalos.
Un ejemplo práctico y sencillo podría ser definir una partición a intervalos en un campo con un intervalo de 50 en 50. Toda la data insertada con valores entre 1 y 50 se encontraran alojadas en el partición numero 1, los datos que se encuentren con valores del 51 al 100 pertenecerán a una nueva partición y así sucesivamente. En el siguiente cuadro tenemos un ejemplo de una tabla padre “Parent Table” llamada “ORDERS” y una tabla hija denominada “Child Table” “ORDERS ITEMS” las cuales están unidas a través de un “Constraint” de referencia, en la misma se denota la relación entre particiones co-relacionadas entre tablas padre e hija.

Características de las “Interval Partitioned-Tables:

  • “Interval-Partitioned tables” pueden ser utilizadas como “Parent-Tables” para particionamiento por referencia “reference partitioning”
  • Los registros son creados en particiones de la tabla padre posterior a la inserción de estos en la tabla hija
  • Cuando un “Interval Partition” es creado en la tabla padre, el nombre de la partición en la tabla hija es heredada en asociación con el nombre de la tabla padre

Mejoras a “Reference Partitioning”
“Reference Partitioning” fue originalmente introducido en “Oracle Database 11g”. Esta Equi-Particiona dos tablas relacionadas por “Constraints” de referencias.
Cuando se particiona una tabla por referencia, las sub-secuentes operaciones de mantenimiento de las particiones de la tabla padre “Parent Table” posee acción de cascada hacia las tablas hijas “Child Tables”. Este mecanismo implica que las tareas de mantenimiento no pueden llevarse a cabo en las tablas referenciadas o también llamadas “Child Tables”.
En “Oracle Database 12c” la partición por referencia fue mejorada en 3 aspectos:

  • “Interval Reference Partitioning” permite particionamiento de “Interval Partitioning” de “Parent Tables”
  • Provee opción de “CASCADE” para operaciones “TRUNCATE PARTITION”. La opción “CASCADE” toma efecto hasta las tablas hijas particionadas por referencia “reference-partitioned child tables”
  • Provee opción de “CASCADE” para operaciones “EXCHANGE [SUB] PARTITION”. La opción “CASCADE” toma efecto hasta las tablas hijas particionadas por referencia “reference-partitioned child tables”

“Truncate Table CASCADE”

  • Si es especificada la opción “CASCADE” al truncar las tablas Las tablas hijas serán truncadas al realizarse un truncamiento a la tabla padre siempre y cuando estos estén unidos al menos a través de un “Constraint” de referencia con opción “ON DELETE CASCADE”


 SQL> TRUNCATE TABLE Myschema.Mytable
CASCADE;


SQL> REM    Create the parent table
SQL> CREATE TABLE intRef_parent
2     (pkcol number not null,
3      col2  varchar2(200),
4      CONSTRAINT pk_intref PRIMARY KEY (pkcol))
5      PARTITION by range (pkcol) interval (10)
6     (PARTITION p1 VALUES less than (10));
SQL> CREATE TABLE intRef_child1
2     (pkcol number not null,
3      col2  varchar2(200),
4      fkcol number not null,
5      CONSTRAINT pk_c1 PRIMARY KEY (pkcol),
6      CONSTRAINT fk_c1 FOREIGN KEY (fkcol)
7      REFERENCES intRef_parent(pkcol) ON DELETE CASCADE)
8      PARTITION by reference (fk_c1);

  • No son necesarios privilegios sobre la tabla hija para que se lleve a cabo dicha operación
  • La opción “CASCADE” no arrojara error en la ejecución de la sentencia en caso de que la tabla padre en la que se esta ejecutando la sentencia no posea tablas hijas.

“Multi-Partition Maintenance Operations”
Previo a “Oracle Database 12c”, el manejador solo permitía “Splitting” o “Merging” de solo dos particiones utilizando los “DDLs” “Alter Table Split/Merge”. Anteriormente el proceso de unir o dividir múltiples particiones se tornaba extensamente complicado y costoso en términos de consumo de recursos de I/O.
Por ej: Supongamos que tenemos una tabla con particiones por mes y nos encontramos en el primer mes del año 2015 y deseamos convertir en una sola partición las 12 particiones correspondientes al año 2014. En dicho escenario se tendría que llevar a cabo 11 DDL de “Alter Table” para lleva a cabo el objetivo. Anterior a “Oracle Database 12c” habría que buscar soluciones para ahorrar recursos para evitar la ejecución de los 11 “DDLs”, las soluciones pueden ser variadas y se basan en operaciones tradicionales de la BBDD. Un ejemplo de ellos podría ser generar una tabla con la sentencia “Create table as” consultando la data de las 12 particiones, de este modo, todos los datos estarían en una sola tabla. Posteriormente se podrían remover de la tabla original las particiones correspondientes a los 12 meses y hacer una nueva partición que contendrá los datos existentes en la tabla que se creo con la operación “Create table as”.
En “Oracle Database 12c” la limitación de operaciones Multi-Partición representa una nueva característica. Ahora dichas operaciones se pueden realizar con diversas particiones a la vez ( mas de dos ) y en una misma operación se podrán llevar a cabo  “Split” y “Merge” a la vez.

“Adding Multiple Partitions”
En “12c” se podrán agregar varias nuevas particiones con la cláusula “ADD PARTICION” correspondiente a la sentencia “ALTER TABLE”. Al agregar varias particiones, las operaciones de índices locales y globales siguen siendo las mismas con respecto a cuando se agrega una sola partición. Las clausulas “ADD PARTITION” y “ADD PARTITIONS” son sinónimos. Dicha nueva capacidad se podría resumir en las siguientes líneas:

  • Se podrán adicionar nuevas múltiples particiones con la clausula “ADD PARTITION” del “Statement” “ALTER TABLE”
  • Las operaciones correspondientes a los índices globales y locales serán las mismas con respecto a cuando se esta adicionando una partición simple
  • Se podrán adicionar múltiples “Range Partitions” en orden ascendente hasta sus valores topes
  • Se podrán adicionar múltiples “List Partitions” a una tabla utilizando un nuevo conjunto de valores si la partición por defecto no existe.

“Creating a Range-Partitioned Table”
En el siguiente ejemplo podemos observar lo siguiente:

  • Creación de cuatro particiones cada una equivalente a registros para un cuarto de ano cada una
  • La columna “time_id” representa el “Partitioning Key”
  • La clausula “VALUE LESS THAN” determina el valor limite de la partición
  • Cada partición esta contenida en un “Tablespace” distinto

“Adding Multiple Partitions”
Adicionando particiones múltiples:
.
“Truncating Multiples Partitions”

  • Se pueden truncar particiones multiples con la sentencia “ALTER TABLE ..  TRUNCATE” para tablas que posean particiones de tipo “Range” o “List Partitioning”
  • Las particiones correspondientes a los índices locales son truncadas en la operación
  • Los índices globales deben ser reconstruidos a menos que se utilice la clausula “UPDATE INDEXES”


 ALTER TABLE ventas TRUNCATE PARTITIONS ventas_q1_2012,

                                                                               ventas_q2_2012,
                                                                               ventas_q3_2012,
                                                                               ventas_q4_2012;


“Dropping Multiples Partitions”

  • Se podrán remover particiones o sub-particiones provenientes de tablas que posean particiones de tipo “Range” o “List Partitioning”. La clausulas a ser utilizadas serán:
    • DROP PARTITION(S)
    • DROP SUBPARTITION
  • El comportamiento en índices globales y locales será el mismo con respecto a cuando una partición simple es removida


 ALTER TABLE ventas DROP PARTITIONS ventas_q1_2012,                          

                                                                           ventas_q2_2012,
                                                                           ventas_q3_2012,
                                                                           ventas_q4_2012;


“Splitting into Multiples Partitions”

  • Con el “Splitting” podremos redistribuir contenido de una partición en múltiples particiones con la clausula “SPLIT PARTITION” del “Statement” “ALTER TABLE”
  • Cada partición nueva constituirá un nuevo segmento que heredara todas las características físicas de la partición de la cual provenga
  • Uso de la sintaxis de “Split” extendido para especificar una lista de nuevas particiones con especificación de valores del mismo modo como cuando es creada una tabla con diversas particiones.

“Merging Multiple Range Partitions”

  • A través del “Merging” podemos unir/compactar dos o mas particiones y sub-particiones en una sola partición
  • La partición resultante heredera las características físicas de la partición limite de las particiones candidatas a ser unidas

Estimados lectores, esperando que haya sido de utilidad el presente artículo. Nos despedimos hasta la próxima.


Joel es un experto DBA con más de 12 años de experiencia, especializado en bases de datos con especial énfasis en la soluciones de alta disponibilidad (RAC, Data Guard, y otras). Es un conferencista habitual en eventos de Oracle como: OTN LAD TOUR y otros. Consultor Internacional con trabajos en más de 20 países alrededor del mundo. Fue el primer latinoamericano en ser nombrado "Experto OTN" en el año 2003, Oracle ACE año 2004 y actualmente Oracle ACE Director.

Mahir es un Senior DBA con mas de 10 anos de experiencia en bases de datos Oracle con especial foco en "High Availability" & "Disaster Recovery Solutions (RAC, Data Guard, RMAN,…)". Mahir actualmente trabaja en el "Central Bank of the Republic of Azerbaijan". El es OCP DBA. Mahir es frecuente orador en el "Azerbaijan Oracle User Group (AZEROUG)".