Saya sedang melihat posting di forum MOSC hari ini tentang Clustering Factor (CF) untuk indeks. Satu hal yang cenderung dilupakan orang ketika berbicara tentang CF adalah bahwa sementara DBA dapat melakukan beberapa aktivitas reorg untuk meningkatkan CF untuk suatu indeks, hal itu berpotensi mengorbankan indeks lain untuk tabel yang sama. Pertimbangkan contoh ini yang saya berikan di utas itu.
Di sini saya memiliki tabel dengan dua indeks. Ini satu-satunya tabel dalam skema saya. Satu indeks (BEI2) memiliki CF yang jauh lebih tinggi dari yang lain (BEI1).
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 135744 MY_TAB_IDX1 2257
DBA ingin "memperbaiki" masalah ini. DBA ingin mengurangi CF untuk IDX2. Cara terbaik untuk melakukannya adalah dengan menarik data keluar dari tabel dan kemudian menyisipkannya kembali, diurutkan berdasarkan kolom tempat IDX2 dibangun.
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
Sekarang CF untuk IDX2 sudah pasti meningkat. Tapi lihat CF di IDX1. Itu menjadi jauh lebih buruk. Faktanya, kedua indeks tersebut tampaknya telah membalik nilai CF. Jika saya mencoba mengatur ulang, kali ini saya memesan berdasarkan kolom IDX1, maka nilai CF akan terbalik lagi.
Moral dari cerita ini adalah bahwa seseorang tidak dapat menjamin bahwa meningkatkan CF untuk satu indeks tidak akan berdampak negatif pada indeks lain dari tabel tersebut.