Jeg kiggede på et indlæg på MOSCs fora i dag om Clustering Factor (CF) for et indeks. En ting, som folk har en tendens til at glemme, når de taler om CF, er, at selvom DBA kan lave nogle reorg-aktiviteter for at forbedre CF for et indeks, vil det potentielt komme på bekostning af et andet indeks for den samme tabel. Overvej dette eksempel, som jeg gav i den tråd.
Her har jeg en tabel med to indekser. Det er den eneste tabel i mit skema. Det ene indeks (IDX2) har en CF meget højere end det andet (IDX1).
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 135744 MY_TAB_IDX1 2257
DBA ønsker at "fikse" dette problem. DBA ønsker at reducere CF for IDX2. Den bedste måde at gøre det på er at trække dataene ud af tabellen og derefter indsætte dem, sorteret efter de(n) kolonne(r), IDX2 er bygget på.
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
Nu er CF til IDX2 absolut forbedret. Men se på CF på IDX1. Det blev meget værre. Faktisk så de to indekser ud til at have vendt CF-værdierne. Hvis jeg forsøger en anden omorganisering, denne gang sorteret efter IDX1-kolonnen(r), vil CF-værdierne vende igen.
Moralen i denne historie er, at man ikke kan garantere, at en forbedring af CF for et indeks ikke vil have en negativ indvirkning på et andet indeks i den tabel.