Ugrás a fő tartalomra

Bitmap indexes alapok



Adattárház, adatelemzések, riportok (Bittérkép indexek = Bitmap indexes)


A bittérképes index haszna igazán olyan oszlopoknál mutatkozik meg, amelyekben kevés a különböző érték, de ezekből sok fordul elő,  és az értékek közel egyenletes eloszlást mutatnak.
Például ha személyek nemét tárolunk egy oszlopban.

Foglaljuk össze miért nem hatékony ilyen esetekben a hagyományos B-fa index.


Az Oracle B-fa index szerkezete:
  • a fa felső részében vannak az úgynevezett ág-blokkok (branch blocks),
  • a fa alján vannak a levélelemek (leaf blocks).
Indexben történő kereséskor először az ág blokkok segítségével tudjuk elérni a levélelemek egy csoportját, amik két irányban össze vannak láncolva, így a tényleges keresett értéket a láncolt listában való léptetéssel találhatjuk meg.
A levélelemekben nem csak az index kulcsa tárolódik el, hanem az ún. ROWID vagyis egy sorazonosító is.
Ha egy egyedi értéket keresünk az indexben azt a végrehajtási lépést idegen szóval index unique scan-nek nevezzük, vagyis index egyedi keresésnek.
Ha azonban több értéket szeretnénk visszakapni, és adattárházban ez a gyakoribb,
index range scan-ről beszélhetünk, vagy index tartomány keresésről.
A keresett értéket megtalálása után a futtató motor a rowid alapján nyúl vissza a táblába
és kéri el az adott sort onnan.
Tehát a keresett értékekhez mindig fel kell olvasni a rowid-t.
Ha azonban egy indexelt oszlop közel egyenletes eloszlású és kevés egyedi érték van,
akkor a levélelemek csoportjai igen nagyra duzzadhatnak, sok sorazonosítót olvas fel a rendszer egy utasítás futtatása közben.
E mellé társul az is hogy előállhat olyan indexszerkezet, blokkmérettől függően,
valamint attól függően hogy hány sor fér bele egy blokkba, hogy egy blokkot többször
is meg kell fogni ahhoz hogy elérjünk minden általunk keresett sorazonosítót.
Tehát ez értelemszerűen több lemezműveletet (IO) igényel és így lassú az eredmény listázás.

 Egyéb tulajdonságai a Bitmap indexek:

  • Rendkívül jól tömöríthetőek, egyértelműen kisebb a mérete egy bitmap-nek
    mint egy egész faszerkezetnek.
  • Indexben való kereséskor nincs szükség teljes rowid-k felolvasására, egy-egy bit vizsgálatával könnyedén el lehet dönteni, hogy az éppen vizsgált sor beleesik-e a keresett tartományba avagy nem.
— DE !!:
Ami miatt a bittérképes index nem használható hatékonyan OLTP környezetben, az a zárolási tulajdonsága.
Valamilyen DML művelet során nem zárolhatunk csak egy bitmap pozíciót az indexben,
a legkisebb zárolási egysége a bittérkép szegmens, ami egy adatblokk fele is lehet akár a méretét tekintve.
Egy OLTP rendszerben ahol állandó jelleggel vannak jelen DML utasítások, ez nagy hátrányt jelent.
Az Oracle adatbázis kezelőjében bitmap index létrehozásakor külön jelezni kell a
BITMAP kulcsszóval a létrehozni kívánt index jellegét.
CREATE BITMAP INDEX dw.ember_nem_bidx ON dw.ember(nem);
Hozzunk létre egy táblát amibe szúrjunk be adatokat, majd a test_flag oszlopára hozzunk létre egy b-fa indexet!
-- tábla létrehozás
CREATE TABLE bitmap_idx_test ( id NUMBER, test_flag VARCHAR2(1) ) STORAGE(initial 256k next 256k);
-- index létrehozás
CREATE INDEXb_tree_idx ON bitmap_idx_test(test_flag) storage(initial 256k next 256k maxextents 200);
-- adatbetöltés
INSERT INTO bitmap_idx_test
 SELECT round(dbms_random.value(1, 5000)),
 case when mod(level, 2) = 0 then 'U' when mod(level, 3) = 0 then 'F'
 else 'M' end case
 FROM dual CONNECT BY level <= 686038;
----- Egy minta:
set echo on
SELECT segment_name, bytes/1024 kilobytes, blocks FROM dba_segments WHERE segment_name = 'B_TREE_IDX';
=>
SEGMENT_NAME KILOBYTES BLOCKS ------------------ ------------- ---------
B_TREE_IDX 28672 3584
set autotrace on SELECT /*+index(bit b_tree_idx) */ * FROM bitmap_idx_test bit WHERE test_flag = 'F';
686038 rows selected.
xecution Plan ---------------------------------------------------------- 0
SELECT STATEMENT Optimizer Mode=CHOOSE (Cost=531 Card=1 K Bytes=19 K) 1 0
TABLE ACCESS BY INDEX ROWID APPS.BITMAP_IDX_TEST (Cost=531 Card=1 K Bytes=19 K) 2 1
INDEX RANGE SCAN APPS.B_TREE_IDX (Cost=1207 Card=522)
A BITMAP használat során a végrehajtási terv (plan) alapján a consistent get-ek száma,
valamint a physical read-ek száma is kevesebb.
A consistent get a memóriából törénő blokkolvasásokat jelenti, míg a physical read a lemezről történő tényleges olvasást.
A bitmap index esetében mind a kettő érték kisebb, így általában hasznos a használata.

Megjegyzések