sql >> Base de Datos >  >> RDS >> Oracle

Una historia de dos factores de agrupación

Estaba mirando una publicación en los foros de MOSC hoy sobre el factor de agrupamiento (CF) para un índice. Una cosa que la gente tiende a olvidar cuando habla del CF es que, si bien el DBA puede realizar alguna actividad de reorganización para mejorar el CF de un índice, potencialmente tendrá a expensas de otro índice para esa misma tabla. Considere este ejemplo que proporcioné en ese hilo.

Aquí tengo una tabla con dos índices. Es la única tabla en mi esquema. Un índice (IDX2) tiene un CF mucho más alto que el otro (IDX1).

SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME      CLUSTERING_FACTOR
--------------- -----------------
MY_TAB_IDX2                135744
MY_TAB_IDX1                  2257

El DBA quiere "arreglar" este problema. El DBA quiere reducir el CF para IDX2. La mejor manera de hacerlo es sacar los datos de la tabla y luego volver a insertarlos, ordenados por la(s) columna(s) en las que se basa IDX2.

SQL> create table my_tab_temp as select * from my_tab;
Table created.
SQL> truncate table my_tab;
Table truncated.
SQL> insert into my_tab select * from my_tab_temp order by pk_id;
135795 rows created.
SQL> commit;
Commit complete.
SQL> exec dbms_stats.gather_table_stats(ownname=>USER,tabname=>'MY_TAB',cascade=>TRUE);
PL/SQL procedure successfully completed.
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME      CLUSTERING_FACTOR
--------------- -----------------
MY_TAB_IDX2                  2537
MY_TAB_IDX1                135747

Ahora el CF para IDX2 definitivamente ha mejorado. Pero mira el CF en IDX1. Se puso mucho peor. De hecho, los dos índices parecían haber invertido los valores de CF. Si intento otra reorganización, esta vez ordenando por la(s) columna(s) IDX1, los valores de CF volverán a cambiar.

La moraleja de esta historia es que no se puede garantizar que mejorar el CF de un índice no tendrá un efecto negativo en otro índice de esa tabla.