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.