OracleMania en Español Volumen 1 - Page 26

rINCON DEL DBA

DBA

26

Repetir el paso 1.

Crear los índices de tipo LOCALES

Los índices LOCALES son permitidos en operaciones a nivel de particiones, tal como en este ejemplo que se está incluyendo la sentencia “INCLUDING

INDEXES” al intercambiar la partición.

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

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

CREATE INDEX b1 ON b(a,b);

CREATE INDEX b2 ON b(a,c);

Realizar la operación de intercambio de partición

SQL> select PARTITION_NAME from dba_tab_partitions where table_name='A';

PARTITION_NAME

------------------------------

POS_DATA_P2

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

Conclusión: Si ahora los índices fueron creados como LOCALES, entonces ¿qué olvidamos? Lo que sucede es que nos faltó un índice. Los índices creados manualmente fueron creados como LOCALES, sin embargo, el índice creado automáticamente al crear la

llave primaria aún es de tipo GLOBAL.

SQL> select b.uniqueness, a.index_name, a.table_name, a.column_name,a.column_position

from dba_ind_columns a, dba_indexes b

where a.index_name=b.index_name and a.table_name = 'A'

order by a.table_name, a.index_name, a.column_position;

UNIQUENES INDEX_NAME TABLE_NAME COLUMN_NAM COLUMN_POSITION

--------- -------------------- ---------- ---------- ---------------

NONUNIQUE A1 A A 1

NONUNIQUE A1 A B 2

NONUNIQUE A2 A A 1

NONUNIQUE A2 A C 2

UNIQUE SYS_C003850 A A 1

Repetir el paso 0.

Agregar una llave primaria con índice LOCAL

Si se piensa en solucionar el problema dado por la cláusula “USING INDEX LOCAL” al crear el índice, tome en cuenta que para poder usar esta cláusula la llave de particionamiento tiene que formar parte de las columnas de la llave primaria. Para el ejemplo que estamos utilizando nuestra llave primaria siempre ha sido la columna “a”, veamos que sucede si queremos que el índice de la llave primaria se cree como LOCAL:

SQL> ALTER TABLE a ADD PRIMARY KEY (a)

USING INDEX LOCAL;

ALTER TABLE a ADD PRIMARY KEY (a) USING INDEX LOCAL

*

ERROR at line 1:

ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE

Index

¿Qué sucede si agregamos el campo de particionamiento como un subconjunto de la llave primaria? La llave primaria será agregada sin problemas. Esto solo se muestra con fines conceptuales, pues en todo el artículo se seguirá usando únicamente la columna “a” como llave

primaria.

SQL> ALTER TABLE a ADD PRIMARY KEY (a,start_date) USING INDEX LOCAL;

Table altered.

SQL> ALTER TABLE a ADD PRIMARY KEY (start_date,a) USING INDEX LOCAL;

Table altered.

¿Cómo solucionamos el problema si no podemos 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ón “DISABLE 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.