Dienstag, Februar 09, 2010

Bitmap Indizes - Teil 2

Ok, Mr. Lewis sagt also, dass die physikalische Ordnung einer Tabelle für die Größe der zugehörigen Bitmap Indizes entscheidend ist (und er hat in aller Regel Recht, wenn er so etwas sagt). Probieren wir das einmal aus:

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