Eu estava olhando para um post nos fóruns do MOSC hoje sobre o Clustering Factor (CF) para um índice. Uma coisa que as pessoas tendem a esquecer ao falar sobre o CF é que, embora o DBA possa fazer alguma atividade de reorganização para melhorar o CF de um índice, ele potencialmente virá às custas de outro índice para essa mesma tabela. Considere este exemplo que eu forneci nesse tópico.
Aqui eu tenho uma tabela com dois índices. É a única tabela no meu esquema. Um índice (IDX2) tem um CF muito maior que o outro (IDX1).
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 135744 MY_TAB_IDX1 2257
O DBA quer “corrigir” esse problema. O DBA quer reduzir o CF para IDX2. A melhor maneira de fazer isso é extrair os dados da tabela e depois inseri-los de volta, classificados pela(s) coluna(s) em que o IDX2 foi construído.
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
Agora o CF para IDX2 melhorou definitivamente. Mas veja o CF no IDX1. Ficou muito pior. Na verdade, os dois índices pareciam ter invertido os valores de CF. Se eu tentar outra reorganização, desta vez ordenando pela(s) coluna(s) IDX1, os valores de CF serão alterados novamente.
A moral desta história é que não se pode garantir que melhorar o CF para um índice não terá um efeito negativo em outro índice daquela tabela.