Díval jsem se dnes na příspěvek na fóru MOSC o Clustering Factor (CF) pro index. Jedna věc, na kterou lidé mají tendenci zapomínat, když mluvíme o CF, je, že zatímco DBA může provést nějakou reorganizační aktivitu, aby zlepšil CF pro index, bude to potenciálně na úkor jiného indexu pro stejnou tabulku. Zvažte tento příklad, který jsem uvedl v tomto vláknu.
Zde mám tabulku se dvěma indexy. Je to jediná tabulka v mém schématu. Jeden index (IDX2) má CF mnohem vyšší než druhý (IDX1).
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 135744 MY_TAB_IDX1 2257
DBA chce tento problém „opravit“. DBA chce snížit CF pro IDX2. Nejlepší způsob, jak toho dosáhnout, je vytáhnout data z tabulky a poté je vložit zpět, seřazená podle sloupců, na kterých je IDX2 postaveno.
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
Nyní se CF pro IDX2 rozhodně zlepšil. Ale podívejte se na CF na IDX1. Bylo to mnohem horší. Ve skutečnosti se zdálo, že oba indexy převrátily hodnoty CF. Pokud se pokusím o antoher reorg, tentokrát seřazení podle sloupce (sloupců) IDX1, pak se hodnoty CF znovu obrátí.
Morálka tohoto příběhu je taková, že nelze zaručit, že zlepšení CF pro jeden index nebude mít negativní vliv na jiný index této tabulky.