Mittwoch, April 21, 2010

Mehrspaltige Bitmap Indizes

da ich mit der Nummerierung der Beiträge langsam Probleme bekomme, versuch ich's jetzt noch mal mit eher inhaltlich begründeten Titelangaben ...

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