Saltar al contenido

Tablas particionadas en ORACLE II

Tablas particionadas en Oracle.

Particionado List

El particionado se establece según una lista de valores definidos sobre el valor de una columna especifica.

CREATE TABLE PRUEBA (C1 NUMBER, C2 VARCHAR(10))

     PARTITION BY HASH(deptno) PARTITIONS 4

       (PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2,

        PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts2);

Este particionado no soporta múltiples columnas y los valores literales deben ser únicos en la lista, permitiendo el uso del valor NULL. El valor DEFAULT sirve para definir la partición donde irán el resto de registros que no cumplen las demás condiciones.

CREATE TABLE HISTORICO (CDHABIL VARCHAR2(3),

CDDNI VARCHAR2(9),

CDDUP VARCHAR2(1),

FECHA DATE)

PARTITION BY LIST (CDHABIL)

(

PARTITION HAB_DEM VALUES(’DEM’),

PARTITION HAB_ROS VALUES(’ROS’),

PARTITION RESTO VALUES(DEFAULT)); 

Particionado Composite

Este tipo de particionado es compuesto, se usan dos tipos de particionados a la vez. Aquí un ejemplo con  Range para el año y Hash para la otra columna:

CREATE TABLE HISTORICO (CDHABIL VARCHAR2(3),

CDDNI VARCHAR2(9),

CDDUP VARCHAR2(1),

ANNIO NUMBER,

CHASH NUMBER)

PARTITION BY RANGE (ANNIO)

SUBPARTITION BY HASH(CHASH)

SUBPARTITIONS 4

(PARTITION ANNIO_01 VALUES LESS THAN (2001)

       (SUBPARTITION p1 TABLESPACE TBS1,

        SUBPARTITION p2 TABLESPACE TBS2),

PARTITION ANNIO_02 VALUES LESS THAN (2002)

(SUBPARTITION p3 TABLESPACE TBS1

 SUBPARTITION p4 TABLESPACE TBS2)

);

Las combinaciones permitidas:

range-hash, range-list, range-range, list-range, list-list, list-hash y hash-hash (Oracle 11g).

En Oracle11g se ha introducido nuevas formas de particiones y mejoras. Pero tampoco he podido probarlas aquí, asi que os las comento por encima:

Particionado System, se realiza de forma interna. Oracle no gestiona donde se almacenan los registros, lo decidimos nosotros cuando hacemos la inserción, diciéndole en que partición queremos realizara:

create table t (c1 int,
                c2 varchar2(4))
     partition by system
    (partition par1,
     partition par2);

 Particionado usando columnas virtuales ( que no existen fisicamente ) y realizamos el particionado sobre ellas.

create table t (c1 int,   c2 date,

c3_virtual char(1) GENERATED ALWAYS AS to_char(sysdate,’fmDay’) virtual)

partition by ….(c3_virtual) ….;

Por si queréis más información sobre columnas virtuales.

http://www.oracle-base.com/articles/11g/VirtualColumns_11gR1.php

Y, a la que creo que se le puede sacar más partido, Particionado Interval.

Puedes utilizarlo para realizar particiones desatendidas. Oracle las crea de manera automática según las va necesitando. Sólo hay que crear una partición base. 

create table HISTORICO (

  c1 number not null,

  c2 date

)

partition by range (c1)

interval (100)

(

   partition par1 values less than (101)

);

Si realizamos un insert con un valor de 900 por ejemplo, Oracle automáticamente creará otra partición.

Con lo que nos olvidamos de gestionar estas particiones.

Os dejo este link para más infomación:

http://www.oracle.com/technology/oramag/oracle/07-sep/o57partition.html