OracleMania en Español Volumen 1 - Page 30

rincon del dba

dba

30

Inmediatamente después de realizar el intercambio de partición el indice global se convierte en estado “UNUSABLE”:

SQL> select table_name, index_name, STATUS from dba_indexes where table_name='A';

TABLE_NAME INDEX_NAME STATUS

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

A A1 N/A

A A2 N/A

A A3 UNUSABLE

Esto es porque los índices globales no son mantenidos automáticamente por Oracle, únicamente los índices locales. Al realizar una operación a nivel de partición, dicha operación también afecta los demás índices globales en la tabla, es por eso que manualmente deben ser

reconstruidos.

La buena noticia

Existe la cláusula “UPDATE GLOBAL INDEXES” que puede ser incluida en la operación de “exchange partition”, esta cláusula se encarga de reconstruir los índices globales de tal manera que después de la operación los índices puedan seguir siendo utilizados por el optimizador de

consultas.

Lo que hace prácticamente esta cláusula es ir “reconstruyendo” las partes del índice que fueron afectadas por la operación al mismo tiempo que la operación de intercambio es realizada, de esto podríamos extraer lo

siguiente:

• La operación “Exchange partition” durará más tiempo, pues ahora no solo se tratará de intercambiar metadatos a nivel del diccionario de datos, sino que también un escaneo de las filas que afectaron el índice debe ser realizado, esto hace que la operación dure más tiempo.

• Datos “redo” y “rollback” pueden ser

generados.

• Las consultas no tendrán un impacto drástico en el rendimiento pues el índice seguirá siendo utilizado por el optimizador de consultas. Si el índice estuviera “UNUSABLE”, dicho índice es omitido inmediatamente por el optimizador.

• Todos los índices globales de la tabla son

regenerados (no reconstruidoscompletamente).

Si no se usa “UPDATE GLOBAL INDEXES”, se necesita reconstruir completamente los índices globales por medio de un “alter index rebuild”.

Esto conlleva lo siguiente:

La reconstrucción del índice puede ser muy

tardado.

• El índice después de la reconstrucción se encuentra en su estado más eficiente.

• El índice es reestructurado, eliminando la

fragmentación.

Repetir el paso No. 0, luego continuar con lo siguiente

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

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

--Nuestro primer índice Global

CREATE INDEX a3 ON a(b,c);

Los índices están en estado “VALID”:

SQL> select table_name, index_name, STATUS from dba_indexes where table_name='A';

TABLE_NAME INDEX_NAME STATUS

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

A A1 N/A

A A2 N/A

A A3 VALID

CREATE INDEX b1 ON b(a,b);

CREATE INDEX b2 ON b(a,c);

Intercambiando la partición pero manteniendo los índices globales:

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

Table altered.