今日、MOSCフォーラムで、インデックスのクラスタリング係数(CF)に関する投稿を見ていました。 CFについて話すときに人々が忘れがちなことの1つは、DBAがインデックスのCFを改善するために再編成アクティビティを実行できる一方で、同じテーブルの別のインデックスを犠牲にする可能性があることです。そのスレッドで提供したこの例を考えてみましょう。
ここに、2つのインデックスを持つテーブルがあります。それは私のスキーマの唯一のテーブルです。一方のインデックス(IDX2)のCFは、もう一方のインデックス(IDX1)よりもはるかに高くなっています。
SQL> select index_name,clustering_factor from user_indexes;
INDEX_NAME CLUSTERING_FACTOR --------------- ----------------- MY_TAB_IDX2 135744 MY_TAB_IDX1 2257
DBAは、この問題を「修正」したいと考えています。 DBAは、IDX2のCFを削減したいと考えています。そのための最善の方法は、データをテーブルから引き出してから挿入し直し、IDX2が構築されている列で並べ替えることです。
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
現在、IDX2のCFは確実に改善されています。しかし、IDX1のCFを見てください。それははるかに悪化しました。実際、2つのインデックスはCF値を反転させたようです。今度はIDX1列で並べ替えて再編成しようとすると、CF値が再び反転します。
この話の教訓は、あるインデックスのCFを改善しても、そのテーブルの別のインデックスに悪影響が及ばないことを保証できないということです。