OracleMania en Español Volumen 1 - Page 27

RINCON DEL DBA

DBA

27

agregar la columna que es usada como llave de particionamiento dentro de las columnas de la

llave primaria?

Oracle recomienda no crear el índice de la llave primaria en la tabla particionada, en lugar de eso, lo que recomienda es usar la opciónDISABLE

VALIDATE”.

ALTER TABLE <partitioned_table_name> ADD CONSTRAINT <constraint name> PRIMARY KEY

( <pk_column> ) DISABLE VALIDATE;

De esta manera se refuerza la unicidad de las filas pero sin que un índice deba de ser creado. Sin embargo, si se omite el índice en la tabla particionada el índice también tiene que omitirse en la tabla no particionada, de lo contrario la operación “exchange partition” fallará tal como lo demostramos a

continuación.

Repetir el paso No. 0 y continuar con lo siguiente:

--El índice no es creado en la tabla A

SQL> alter table a add constraint constraint1 primary key (a) DISABLE NOVALIDATE;

Table altered.

--El índice sí es creado en la tabla B

SQL> ALTER TABLE b ADD PRIMARY KEY (a);

Table altered.

SQL> CREATE INDEX a1 ON a(a,b) LOCAL;

Index created.

SQL> CREATE INDEX a2 ON a(a,c) LOCAL;

Index created.

SQL> CREATE INDEX b1 ON b(a,b);

Index created.

SQL> CREATE INDEX b2 ON b(a,c);

Index created.

SQL> ALTER TABLE A EXCHANGE PARTITION POS_DATA_P2 WITH TABLE B INCLUDING INDEXES WITHOUT VALIDATION;

ALTER TABLE A EXCHANGE PARTITION POS_DATA_P2 WITH TABLE B INCLUDING INDEXES WITHOUT VALIDATION

*

ERROR at line 1:

ORA-14098: index mismatch for tables in ALTER TABLE EXCHANGE PARTITION

Pero, si únicamente se omite el índice en la tabla no particionada, la tabla particionada puede seguir teniendo el índice creado y de igual manera el “Exchange partition” se realizará sin problemas. ¿Puede deducir alguna regla de esto? Inténtelo.

Repetir el paso No. 0 y continuar con lo siguiente:

--El índice sí es creado en la tabla A

SQL> ALTER TABLE a ADD PRIMARY KEY (a);

Table altered.

--El índice no es creado en la tabla B

SQL> alter table b add constraint contraint1 primary key (a) DISABLE NOVALIDATE;

Table altered.

SQL> CREATE INDEX a1 ON a(a,b) LOCAL;

Index created.

SQL> CREATE INDEX a2 ON a(a,c) LOCAL;

Index created.

SQL> CREATE INDEX b1 ON b(a,b);

Index created.

SQL> CREATE INDEX b2 ON b(a,c);

Index created.

SQL> ALTER TABLE A EXCHANGE PARTITION POS_DATA_P2 WITH TABLE B INCLUDING INDEXES WITHOUT VALIDATION;

Table altered.