クラスタリング係数 - 計算方法に関する素晴らしい簡単な説明:
基本的に、CF はフル インデックス スキャンを実行し、各インデックス エントリの行 ID を調べることによって計算されます。参照されているテーブル ブロックが前のインデックス エントリのテーブル ブロックと異なる場合、CF はインクリメントされます。参照されているテーブル ブロックが前のインデックス エントリと同じである場合、CF はインクリメントされません。そのため、CF は、テーブル内のデータがインデックス エントリ (常にインデックス エントリの順序で並べ替えられ、格納されている) との関係でどの程度適切に並べられているかを示します。CF が優れている (低い) ほど、インデックスを使用する効率が高くなります。これは、インデックスを介して必要なデータを取得するためにアクセスする必要があるテーブル ブロックが少なくなるためです。
私のインデックス統計:
だから、ここに分析中の私のインデックス(1列だけのインデックス)があります。
インデックスの開始PK_
は私の主キーでUI
あり、一意のキーです。(もちろん、どちらも一意の値を保持します)
クエリ 1:
SELECT index_name,
UNIQUENESS,
clustering_factor,
num_rows,
CEIL((clustering_factor/num_rows)*100) AS cluster_pct
FROM all_indexes
WHERE table_name='MYTABLE';
結果:
INDEX_NAME UNIQUENES CLUSTERING_FACTOR NUM_ROWS CLUSTER_PCT
-------------------- --------- ----------------- ---------- -----------
PK_TEST UNIQUE 10009871 10453407 96 --> So High
UITEST01 UNIQUE 853733 10113211 9 --> Very Less
PK の CF が最も高く、他の一意のインデックスはそうではないことがわかります。
私を襲った唯一の論理的な説明は、下のデータが実際には Unique インデックスの列の順序で格納されているということです。
1) この理解で正しいですか?
2) 最小の数値である PK を与える方法はありますCF
か?
3) これらの両方のインデックスを使用してクエリのコストを確認すると、単一の選択では非常に高速です。それでも、CF 番号は私たちを困惑させます。
テーブルは 1,000 万レコードを超える比較的巨大で、リアルタイムの挿入/更新も受け取ります。
データベースのバージョンは Exadata X2 上の Oracle 11gR2 です