Primary Key En Tablas Particionadas
Una Tabla Particionada es una buena opción para las tablas transaccionales que contengan mucho volumen de registros y/o que vayan guardando una historia o se necesiten históricos.
Al crear una Tabla Particionada, que ésta contenga índices locales a la partición y no globales (incluyendo la PK) facilita la depuración de sus particiones, sobre todo desde el punto de vista de administración (DBAs).
Para que la PK pueda ser local a las particiones, en la conformación de ésta debe existir el campo por el cuál se particiona.
Ejemplo
CREATE TABLE LA_TABLA ( ID_TABLA NUMBER(10) NOT NULL, UN_CAMPO VARCHAR2(3) NOT NULL, FEC_ALGO DATE NOT NULL, OTR_CAMPO NUMBER(14,4) NULL) PARTITION BY RANGE (FEC_ALGO) ( PARTITION LA_TABLA_200805 VALUES LESS THAN (TO_DATE('2008-06-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), PARTITION LA_TABLA_200806 VALUES LESS THAN (TO_DATE('2008-07-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')), PARTITION LA_TABLA_200807 VALUES LESS THAN (TO_DATE('2008-08-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')));
ALTER TABLE LA_TABLA ADD CONSTRAINT LA_TABLA_PK PRIMARY KEY (ID_TABLA, FEC_ALGO) USING INDEX LOCAL ( PARTITION LA_TABLA_200805, PARTITION LA_TABLA_200806, PARTITION LA_TABLA_200807 );
Como ven en la creación de la PK se le indica que ésta es local a las particiones.
El campo de partición tiene que estar en la PK, pero puede ir en cualquier orden, como primer campo o en el medio o último, donde le convenga a la aplicación (según como se aproveche más para los accesos).
Sí, y queda una PK compuesta con algo de sentido de negocio...
Esta tabla en particular está particionada por mes, esto es lo más común, pero se puede particionar por cualquier rango de tiempo, o aún con rangos numéricos no basados en el tiempo (no hace falta que el campo sea date), esto va a demanda de la carga de datos.