Index Bitmapowy w Oracle jest specjalną strukturą danych powiązaną z tabelą, pozwalającą przyspieszyć dostęp do danych. Charakterystyczną cechą indeksu bitmapowego jest jego wysoka skuteczność w przyspieszaniu wykonywania zapytań po kolumnach o niskiej różnorodności. W tym wpisie opiszę strukturę oraz zasadę działania indexu bitmapowego.
Ten wpis jest częścią Kurs Oracle SQL
Index Bitmapowy (eng. Bitmap Index) w bazie danych Oracle są bardzo skuteczne w przypadku wartości o niskiej kardynalności (eng. cardinality). Kardynalność a zdecydowanie częściej używana angielska nazwa “cardinality” to po prostu ilość unikalnych wartości danej kolumny. Tak więc kolumny o niskim poziomie kardynalności są dobrymi kandydatami do tworzenia indexów Bitmapowych.
Odwrotna sytuacja jest w przypadku indexu typu B-tree które bardzo dobrze sprawdzają się w tabelach o dużym zróżnicowaniu wartości (wysokiej kardynalności). Działa i budowę indexu typu B-tree opisałem w wpisie Index w Oracle.
Budowa Indexu Bitmapowego w bazie danych
Index bitmapowy w bazie danych Oracle logicznie można opisać jako mapę wartości kolumny, bitów odpowiadających czy dany rekord zawiera wskazaną wartość oraz adres tego rekordu w tabeli. Przykładowy index bitmapowy dla tabeli może wyglądać jak na poniższym schemacie:
Na powyższym schemacie przedstawiona jest tabela z sześcioma rekordami z trzema różnymi wartościami. Index bitmapowy wyróżnia trzy kluczowe elementy:
- Wartości występujące w kolumnie – w indexie bitmapowym przechowywane są wszystkie wartości jakie znajdują się w kolumnie na której nałożony został index. W powyższym przykładzie są to wartości: “Wartość 1”, “Wartość 2”, “Wartość 3”
- Adres rekordu – w schemacie opisane jako pola rekord 1, rekord 2…rekord 6 czyli rowid rekordu w tabeli na który wskazuje index. Przy znalezieniu rekordu w indexie odpowiadającemu warunkowi baza danych sięga do rekordu z tabeli w celu pobrania pozostałych wartości.
- bit – czyli wartość 0 lub 1 odpowiadająca czy dany rekord posiada zadaną wartość czy też nie. Dzięki reprezentacji bitu baza danych wie, że dane zapytanie spełnia warunek lub nie.
Dzięki zastosowaniu reprezentacji bitowej i mapy baza danych może bardzo szybko sprawdzić czy dany rekord spełnia warunek zapytania. W przypadku zapytania baza danych konwertuje i filtruje mapę bitową dzięki czemu przed sięgnięciem po dane do tabeli wie które rekordy chce sprawdzić. Baza danych może index bitmapowy skonwertować na potrzeby zapytania. Gdybyśmy w zapytaniu szukali rekordów z wartością 1 lub wartością 2 to baza danych może index skonwertować do poniższej postaci.
Operacje bitowe są wykonywane bardzo efektywnie dzięki czemu wynik jest uzyskiwany bardzo szybko. Dzięki zastosowaniu indexu bitmapowego baza danych wyfiltruje rekordy spełniające warunek zapytania i finalnie sięgnie tylko po rekordy które spełniają warunki zapytania. Takie zastosowanie indexu bitmapowego może znacznie przyspieszyć jego wykonanie.
Kilka indeksów bitmapowych i ich konwersja
Baza danych potrafi skonwertować kilka indexów bitmapowych w jedną mapę i ją przefiltrować. Załóżmy poniższą tabelę z dwoma indexami bitmapowymi.
Baza danych potrafi skonwertować powyższe dwa indexy do jednej mapy i na jej podstawie przefiltorwać wyniki nim sięgnie po dane do tabeli:
Wynik operacji pokazuje, że tylko jeden z sześciu rekordów odpowiada wynikowi. W tej sytuacji baza danych pobierze dane z tabeli tylko dla tego jednego rekordu.
Update na tabeli z indeksem bitmapowym w Oracle
Baza danych w trakcie aktualizacji danych w tabeli na której założony zostanie index bitmapowy blokuje wszystkie rekordy z tą wartością. Dzieje się tak ponieważ baza danych aktualizuje nie pojedynczy bit a całą strukturę zadanej wartości. Z tego względu indeksów bitmapowych nie powinno się używać na tabelach na których często zachodzą zmiany. Indeksy bitmapowe powinno się stosować na tabelach które służą najczęściej do odczytu danych.
Podsumowanie: index bitmapowy w Oracle
- Indexy bitmapowe w bazie danych Oracle służą do przyspieszania wykonywania zapytań
- Indexy bitmapowe mają strukturę mapy składającą się z unikalnych wartości kolumny, rowid oraz bitów mówiących czy dany rowid zawiera lub nie wartość.
- Indexy bitmapowe powinno się stosować na kolumnach o niskiej kardynalności
- Indexy bitmapowe mogą być łączone w celu wyfiltrowania danych przed sięgnięciem do danych tabeli
- Indexy bitmapowe nie powinny być stosowane na tabelach które często się zmieniają
“Gdybyśmy w zapytaniu szukali rekordów z wartością 1 lub wartością 2 to baza danych może index skonwertować do poniższej postaci.” na podstawie przedstawionego rysunku powinno chodzić o wartości 1 i 3.
Jaro dobrze ale jeżeli te wartości są zmiennymi?
Wartości zapisane w indeksie nie mogą być zmiennymi.
Dlaczego “Wartość 1 OR Wartość 2” daje poniższe wyniki:
1 1 1 0 0 1
nie powinno być:
1 0 1 1 1 0
Dla Płeć również jest źle, powinno być:
Wartość rekord 1 rekord 2 rekord 3 rekord 4 rekord 5 rekord 6
M 0 0 1 0 1 0
K 1 1 0 1 0 1
Dla Płeć również jest źle, powinno być:
Wartość rekord 1 rekord 2 rekord 3 rekord 4 rekord 5 rekord 6
M 0 0 1 0 1 0
K 1 1 0 1 0 1