OracleMania en Español Volumen 1 - Page 28

rINCON DEL DBA

DBA

28

Index created.

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

Table altered.

Regla: Los índices creados en la tabla no particionada son los que determinarán qué índices deben ser LOCALES en la tabla particionada. Si existe un índice en la tabla particionada que debe ser LOCAL pero que por alguna razón no podemos realizarlo (como en el caso de la llave primaria que no contiene la columna de particionamiento) entonces, lo mejor sería quitar el índice en la tabla no particionada.

El orden de las columnas de las tablas

Uno de las causas más típicas en operaciones de “Exchange partition” es tener una o varias columnas de la tabla no particionada en diferente posición que las columnas de la tabla particionada. Se debe estar seguro que las dos tablas tienen sus columnas en la

misma posición.

Usando las siguientes tablas…

create table a(

start_date TIMESTAMP ,

a number,

b varchar2(20),

c number)

PARTITION BY RANGE (start_date)

INTERVAL(NUMTODSINTERVAL (1, 'DAY'))

( PARTITION pos_data_p2 VALUES LESS

THAN (TO_DATE('05-03-2014', 'DD-MM-YYYY')) );

--Se invirtió el orden de las columnas

create table b(

c number,

b varchar2(20),

a number,

start_date TIMESTAMP

);

… se obtendrá el siguiente error:

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-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

El mismo número de columnas en las tablas

Así como la posición de las columnas es muy importante al momento de hacer una operación “Exchange partition”, lo es también el número de columnas en cada tabla. Las dos tablas deben de tener el mismo número de columnas. Este también es un error muy típico en las operaciones de

intercambio de particiones.

Usando las siguientes tablas…

create table a(

start_date TIMESTAMP ,

a number,

b varchar2(20),

c number)

PARTITION BY RANGE (start_date)

INTERVAL(NUMTODSINTERVAL (1, 'DAY'))

( PARTITION pos_data_p2 VALUES LESS

THAN (TO_DATE('05-03-2014', 'DD-MM-YYYY')) );

--Una columna extra fue agregada, La columna “d”.

create table b(

start_date TIMESTAMP ,

a number,

b varchar2(20),

c number,

d number);

… se obtendrá el siguiente error:

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-14096: tables in ALTER TABLE EXCHANGE PARTITION must have the same number of columns