Pokaże w tym wpisie krótki zarys tego, kiedy optymalizator korzysta z indeksu,
a kiedy skanuje całą tabelę. (PK – oznacz klucz główny – Primary Key)

create table dzialanie_indeksow
(id int primary key,
nazwa varchar2(20),
opis varchar2(20),
status varchar2(20));
/
create index statusIndex on dzialanie_indeksow(status)

/
--baza przeszukuje indeks unikalny dla PK, a następnie przechodzi do tabeli 
--i zwraca dane
select * from dzialanie_indeksow
where id = 1

/
--baza przeszukuje indeks unikalny dla PK(wszystkie potrzebne wartosci sa w indeksie)
select id from dzialanie_indeksow
where id = 1

/
--przeszukania całego indeksu w celu znalezienia
--wszystkich wartości odpowiadających klauzuli WHERE — skanowanie indeksu.
--Ponieważ wybieramy kolumny nie znajdujące się w indeksie, konieczne jest
--również odwołanie się do danych zawartych w tabeli.
select * from dzialanie_indeksow
where status = 'OK'

/
-- dla kolumny opis nie ma indeksu, 
--zatem w celu znalezienia wartości konieczny jest pelen skan tabeli
select id from dzialanie_indeskow
where opis = 'xyz'

Może się wydawać, że nie ma  różnicy pomiędzy skanowaniem tabeli i indeksu,
ponieważ do znalezienia konkretnej wartości konieczne jest przechowanie wszystkich wpisów obiektu.
Indeks jest jednak z reguły mniejszy i specjalnie przystosowany do skanowania,
więc jego skanowanie jest zazwyczaj znacznie szybsze, gdy chcesz uzyskać jedynie niewielką
część rekordów z tabeli. Jeżeli natomiast chcesz pobrać, powiedzmy, więcej niż 30% tabeli,
indeks może już okazać się niekorzystny.
Nie ma jednak schematu, który pozwoliłby z całą pewnością określić, że dla takiego zakresu
danych indeks byłby zawsze korzystny. Każdy kod należy traktować osobno i analizować go pod kątem szybkości pobierania danych.

Written by Przemysław Starosta