Mich hat noch interessiert, wie die Speicherung mehrspaltiger Bitmap Indizes aussieht. Dazu folgender Test:
-- Anlage einer Testtabelle create table test as select rownum id , mod(rownum, 5) col1 , trunc(rownum/ 200) col2 from dual connect by level < 1000 -- Anlage von Bitmap Indizes create bitmap index test_bidx1 on test(col1); create bitmap index test_bidx2 on test(col2); create bitmap index test_bidx3 on test(col1, col2);
Die Tabelle enthält 999 Sätze und zu col1 und col2 jeweils 5 verschiedene Werte, wobei die col2-Werte geclustert sind und die col1-Werte nicht. Über die dba_segments kann man sie zugehörigen Block ermitteln und anschließend einen Blockdump durchführen:
SQL> r 1 select header_file 2 , header_block 3 , blocks 4 from dba_segments 5* where segment_name = upper('test_bidx2') HEADER_FILE HEADER_BLOCK BLOCKS ----------- ------------ ---------- 4 239 8 SQL> alter system dump datafile 4 block min 239 block max 246; System wurde geändert.
Im Blockdump finden sich für die einspaltigen Indizes Einträge folgender Struktur:
row#0[16180] flag: ------, lock: 0, len=48 col 0; len 1; (1): 80 col 1; len 6; (6): 01 00 00 e0 00 00 col 2; len 6; (6): 01 00 00 e0 00 c7 col 3; len 29; (29): cf ff ff ff ff ff ff ff ff cf ff ff ff ff ff ff ff ff cf ff ff ff ff ff ff ff ff c8 7f
Für einen mehrspaltigen Index sieht der Dump folgendermaßen aus:
row#0[16179] flag: ------, lock: 0, len=49 col 0; len 1; (1): 80 col 1; len 1; (1): 80 col 2; len 6; (6): 01 00 00 e0 00 00 col 3; len 6; (6): 01 00 00 e0 00 c7 col 4; len 28; (28): cf 10 42 08 21 84 10 42 08 cf 21 84 10 42 08 21 84 10 cf 42 08 21 84 10 42 08 21 02
Der mehrspaltige Index enthält demnach eine zusätzliche col-Angabe. Und während für die einspaltigen Indizes jeweils 5 row-Einträge erscheinen, sind es für die Kombination beider Spalten 5 * 5 = 25 Einträge. Die zugehörige Bitmap (col4) gibt dann an, in welchen Datensätzen die gegebene Wertkombination erscheint. Da die beiden Spalten in Kombination nicht mehr geclustert sind, ist das Bitmap relativ komplex. Wenn man aber in der Testtabelle auch col1 clustert (also beide Spalten mit den jeweils identischen Werte bestückt), ergibt sich wieder ein Bitmap mit vielen ff-Einträgen, da die 0-Einträge gut komprimiert werden können (mehr dazu findet man in Julian Dykes berühmter Bitmap-Präsentation).
Keine Kommentare:
Kommentar veröffentlichen