Rozszerzymy teraz bazę testową z poprzedniego artykułu o nowe kolumny i wiersze.
Rozszerzona baza testowa
Dodamy dwie kolumny i dwa wiersze
PESEL | IMIE | NAZWISKO | PLEC | DATA_URODZENIA |
62 | Jan | Kowalski | M | 2012-01-02 |
51 | Ewa | Wiśniewska | K | 2012-01-03 |
73 | Piotr | Kowalski | M | 2012-01-03 |
48 | Anna | Nowak | K | 2012-01-05 |
56 | Michał | Wójcik | M | 2012-01-04 |
Indeks na jednym polu
Załóżmy że chcielibyśmy wykonać zapytanie:
select * from osoby where data_urodzenia='2012-01-03'
Zakładamy indeks na jednym polu:
create index on osoby(data_urodzenia)
Wykonanie tego zapytania spowoduje przejrzenie indeksu oraz wybranie 2 wierszy.
Warunek na dwóch polach, indeks na jednym
Pozostawmy indeks jak poprzednio
create index on osoby(data_urodzenia)
natomiast warunek uzupełnimy o jedno pole
select * from osoby where plec='K' and data_urodzenia='2012-01-03'
Wykonanie przy tym indeksie jest identyczne jak przy pojedynczym indeksie – przejrzenie indeksu, wybranie wg indeksu 2 wierszy a następnie odrzucenie jednego z dwóch niepasującego wiersza
Warunek na dwóch polach, indeks podwójny
Tym razem indeks będzie podwójny
create index on osoby(data_urodzenia, plec)
Zapytanie bez zmian
select * from osoby where plec='K' and data_urodzenia='2012-01-03'
Teraz baza korzystając z indeksu wybierze bezpośrednio jeden pasujący wiersz, już bez odrzucenia rekordu
Kolejność pól w indeksie
Zmienimy nieco zapytanie na warunek większości
select * from osoby where plec='K' and data_urodzenia >= '2012-01-03'
Jak zadziała pierwszy indeks?
create index on osoby(data_urodzenia, plec)
Przypominam że indeks jest pomocniczą posortowaną tabelą. Ten indeks jest posortowany w kolejności według pól: data_urodzenia i płeć, czyli wygląda tak:
PESEL | IMIE | NAZWISKO | PLEC | DATA_URODZENIA |
62 | Jan | Kowalski | M | 2012-01-02 |
51 | Ewa | Wiśniewska | K | 2012-01-03 |
73 | Piotr | Kowalski | M | 2012-01-03 |
56 | Michał | Wójcik | M | 2012-01-04 |
48 | Anna | Nowak | K | 2012-01-05 |
Przy warunku mniejszości indeks musi wybrać najpierw grupę 4 pasujących wierszy do warunku na datę urodzenia a następnie odrzucić 2 nie pasujące wiersz do warunku na płeć.
Teraz odwróćmy kolejność w indeksie:
create index on osoby(plec, data_urodzenia)
Tabela indeksu posortowana wygląda tak:
PESEL | IMIE | NAZWISKO | PLEC | DATA_URODZENIA |
51 | Ewa | Wiśniewska | K | 2012-01-03 |
48 | Anna | Nowak | K | 2012-01-05 |
62 | Jan | Kowalski | M | 2012-01-02 |
73 | Piotr | Kowalski | M | 2012-01-03 |
56 | Michał | Wójcik | M | 2012-01-04 |
Teraz wykonanie indeksu rozpocznie się od warunku na płeć a następnie na datę i zostanie wybrany spójny przedział z tabeli indeksowej – wybrane zostaną od razu 2 pasujące wiersze.