Meine bisher verwendeten Test-Tabellen waren sehr stark vorsortiert, so dass die Clusterung der Werte extrem ausfiel:
SQL> r 1 select INDEX_NAME 2 , INDEX_TYPE 3 , TABLE_NAME 4 , LEAF_BLOCKS 5 , DISTINCT_KEYS 6 , CLUSTERING_FACTOR 7 from user_indexes 8* where table_name in ('TEST1', 'TEST2') INDEX_NAME INDEX_TYPE TABLE_NAME LEAF_BLOCKS DISTINCT_KEYS CLUSTERING_FACTOR --------------- ---------- ---------- ----------- ------------- ----------------- TEST2_IDX1 NORMAL TEST2 1099 1000000 1962 TEST2_IDX2 NORMAL TEST2 1093 100001 1962 TEST2_IDX3 NORMAL TEST2 1030 10001 1962 TEST2_IDX4 NORMAL TEST2 1024 1001 1962 TEST2_IDX5 NORMAL TEST2 962 101 1962 TEST2_IDX6 NORMAL TEST2 956 11 1962 TEST2_IDX7 NORMAL TEST2 1436 1000000 1962 TEST2_IDX8 NORMAL TEST2 1366 100001 1962 TEST2_IDX9 NORMAL TEST2 1297 10001 1962 TEST2_IDX10 NORMAL TEST2 1230 1001 1962 TEST2_IDX11 NORMAL TEST2 1161 101 1962 TEST2_IDX_ALL NORMAL TEST2 2380 1000000 1962 TEST1_BIDX1 BITMAP TEST1 1718 1000000 1000000 TEST1_BIDX2 BITMAP TEST1 186 100001 100001 TEST1_BIDX3 BITMAP TEST1 27 10001 10001 TEST1_BIDX4 BITMAP TEST1 12 1001 1001 TEST1_BIDX5 BITMAP TEST1 12 101 101 TEST1_BIDX6 BITMAP TEST1 10 11 21 TEST1_BIDX7 NORMAL TEST1 1436 1000000 1962 TEST1_BIDX8 NORMAL TEST1 1366 100001 1962 TEST1_BIDX9 NORMAL TEST1 1297 10001 1962 TEST1_BIDX10 NORMAL TEST1 1230 1001 1962 TEST1_BIDX11 NORMAL TEST1 1161 101 1962 TEST1_BIDX_ALL BITMAP TEST1 3003 1000000 1000000
Für die meisten der B*Tree-Indizes liegt der Clustering-Factor in der Nähe der Anzahl der Blöcke, was ein günstiges Zeichen ist (negativ wäre eine Annäherung an die Anzahl der Zeilen). Für Bitmap-Indizes bedeutet der Clustering-Factor etwas Anderes, aber ich habe gerade nicht mehr genau in Erinnerung, was das war (irgendwer hat dazu vor nicht allzu langer Zeit irgendwo irgendwas geschrieben - mag sein, dass es auch wieder der Herr Lewis war).
Jetzt definiere ich eine unsortierte Tabelle:
create table test3 as select * from test1 order by dbms_random.value;
Und erzeuge dazu einen Bitmap Index:
create bitmap index test3_bidx2 on test3(col2); SQL> select segment_name 2 , segment_type 3 , blocks 4 from user_segments 5 where segment_name like 'TEST%BIDX2'; SEGMENT_NAME SEGMENT_TYPE BLOCKS ------------------------------ ------------------ ---------- TEST1_BIDX2 INDEX 256 TEST3_BIDX2 INDEX 448 SQL> select INDEX_NAME 2 , INDEX_TYPE 3 , TABLE_NAME 4 , LEAF_BLOCKS 5 , DISTINCT_KEYS 6 , CLUSTERING_FACTOR 7 from user_indexes 8 where INDEX_NAME like 'TEST__BIDX2'; INDEX_NAME INDEX_TYPE TABLE_NAME LEAF_BLOCKS DISTINCT_KEYS CLUSTERING_FACTOR --------------- ---------- ---------- ----------- ------------- ----------------- TEST1_BIDX2 BITMAP TEST1 186 100001 100001 TEST3_BIDX2 BITMAP TEST3 397 100001 100001
Für den Fall der unsortierten Tabelle ist der Index deutlich größer, aber der Clustering_Factor bleibt unverändert. Für einen B*Tree-Index bleibt die Größe unverändert, aber der Clustering-Factor ändert sich (erwartungsgemäß) recht dramatisch:
SQL> r 1 select segment_name 2 , segment_type 3 , blocks 4 from user_segments 5* where segment_name like 'TEST__IDX2' SEGMENT_NAME SEGMENT_TYPE BLOCKS ------------------------------ ------------------ ---------- TEST2_IDX2 INDEX 1152 TEST3_IDX2 INDEX 1152 SQL> r 1 select INDEX_NAME 2 , INDEX_TYPE 3 , TABLE_NAME 4 , LEAF_BLOCKS 5 , DISTINCT_KEYS 6 , CLUSTERING_FACTOR 7 from user_indexes 8* where INDEX_NAME like 'TEST__IDX2' INDEX_NAME INDEX_TYPE TABLE_NAME LEAF_BLOCKS DISTINCT_KEYS CLUSTERING_FACTOR --------------- ---------- ---------- ----------- ------------- ----------------- TEST2_IDX2 NORMAL TEST2 1093 100001 1962 TEST3_IDX2 NORMAL TEST3 1093 100001 997817
Keine Kommentare:
Kommentar veröffentlichen