Jag tittade på ett inlägg på MOSC-forumen idag om Clustering Factor (CF) för ett index. En sak som folk tenderar att glömma när de pratar om CF är att även om DBA kan göra någon omorganiseringsaktivitet för att förbättra CF för ett index, kommer det potentiellt att komma på bekostnad av ett annat index för samma tabell. Tänk på det här exemplet som jag gav i den tråden.
Här har jag en tabell med två index. Det är den enda tabellen i mitt schema. Det ena indexet (IDX2) har en CF som är mycket högre än det andra (IDX1).
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 135744 MY_TAB_IDX1 2257
DBA vill "fixa" det här problemet. DBA vill minska CF för IDX2. Det bästa sättet att göra det är att dra ut data från tabellen och sedan infoga tillbaka, sorterade efter kolumnen/kolumnerna IDX2 bygger 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 har CF för IDX2 definitivt förbättrats. Men titta på CF på IDX1. Det blev mycket värre. Faktum är att de två indexen verkade ha vänt CF-värdena. Om jag försöker med en annan omorganisation, den här gången efter IDX1-kolumn(erna), kommer CF-värdena att vända igen.
Moralen i den här historien är att man inte kan garantera att en förbättring av CF för ett index inte kommer att ha en negativ inverkan på ett annat index i den tabellen.