Documente Academic
Documente Profesional
Documente Cultură
Obiective
- Insusirea notiunii de index.
- Tipuri de indexi:
- Simpli, compusi
- Bazati pe functii;
- B-Tree, Bitmap;
- Gestiunea indexilor.
1. Notiunea de index.
1
Sintaxa generala de creare a unui index.
Sintaxa generala:
Exista clauze diferite pentru diverse tipuri de indexi: normali („table_index_clause”), bitmap,
cluster.
Cand se creaza un index, serverul aloca automat un segment de index in tablespace-ul de index
pentru a stoca datele. Tablespace-ul pentru index este fie cel predefinit pentru proprietar, fie cel
numit explicit in comanda CREATE INDEX. Acesta poate fi unul diferit fata de cel al tabelei
asociate. Pentru obtinerea performantelor optime se recomanda ca tabela si indexul asociat sa
fie stocati in tablespace-uri diferite.
Exemplu:
CREATE INDEX idxemp_ename ON emp(ename);
Pentru stocarea indexilor normali, serverul Oracle foloseste structuri B-Tree. Acestea sunt
niste arbori echilibrati.
Fara indexare, cautarea unei valori intr-o lista de n linii, parcurge un numar mediu de n/2
linii, valoarea critica daca n creste foarte mult. Daca aceeasi lista de n linii se stocheaza intr-un
arbore de valori ordonate, atunci se parcurg log(n) linii, ceea ce imbunatateste timpul de
cautare.
2
Exista doua tipuri blocuri:
- Ramuri (‘branch blocks’): date stocate pentru cautare, pointeaza catre frunze
- Frunze (‘leaf blocks’): stocheaza perechi de valori si rowid
3
2. Indexi normali, simpli sau compusi, unici, ne-unici, bazati pe functii.
Indexii trebuie creati si pot duce la imbunatatirea timpului de raspuns la interogari doar
in anumite conditii:
- coloana de indexare este utilizata des in clauza WHERE pentru join-uri sau pentru filtre;
- tabela contine multe inregistrari (de la cateva mii in sus);
- rezultatul interogarilor aduce in jur de 10% din continutul tabelelor;
- coloanele de indexare contin o paleta larga de valori si pot contine valori NULL;
4
3.2 Index normal, simplu, ne-unic.
Se creaza pe o tabela pe o coloana cu valori ne-unice.
- pentru coloanele din conditia de join:
CREATE INDEX idxemp_deptno ON emp(deptno);
Serverul foloseste indexul pentru interogari de tipul:
SELECT * from emp e, dept d WHERE e.deptno = d.deptno;
8) Atat timp cat cheia gasita <= valoarea de stop (‘20/02/1982’) se executa:
Scopul unui index este de a furniza pointeri spre liniile din tabel pentru valorile date.
Pentru indexii normali acest lucru este implementat prin structuri arborescente de tip B-tree.
Un index normal stocheaza, pe langa valoarea cheii si o lista de rowid-uri pentru acea cheie,
cu scopul de a localiza liniile corespunzatoare.
In depozitele de date cu tabele de tip „fact” cu foarte multe inregistrari se folosesc
indexii bitmap. Acest lucru este necesar deoarece o structura de tip B-tree ar fi foarte
costisitoare ca spatiu de stocare si timp de parcurgere pentru un volum mare de date.
La un index bitmap pentru fiecare cheie se stocheaza un harta de biti (bitmap) in loc de
lista de rowid-uri. Fiecare bit din harta corespunde cu un posibil rowid. Daca bitul este setat
atunci linia cu rowid-ul corespunzator contine valoarea cheie. O functie de mapare
converteste pozitia bitului in rowid-ul liniei. Daca numarul de valori de cheie diferite este
mic, atunci spatiul de stocare este redus dramatic.
Indexarea de tip bitmap combina indexii care corespund cu diverse conditii din clauza
WHERE. Liniile care nu indeplinesc toate conditiile de filtrare sunt eliminate, castigandu-se
timp de raspuns.
6
Cardinalitatea unei coloane este data de numarul de valori distincte in comparatie cu
numarul total de linii. Astfel, daca avem un tabel cu un milion de inregistrari si o coloana
are 10 mii de valori distincte posibile, atunci acea coloana are cardinalitate mica si este un
candidat pentru un index de tip bitmap.
Coloanele cu cardinalitate mare sunt candidate pentru indexii normali stocati in arbori de
tip B-tree.
Indexii de tip bitmap pot imbunatati substantial performantele interogarilor ad-hoc ce
includ expresii avand coloane de cardinalitate redusa in clauza WHERE, coloane conectate
cu operatori AND, OR. Daca numarul de linii intoarse este mic nu este necesara o scanare
completa a tabelei, interogarea avand un timp de raspuns foarte mic.
Se considera tabela CUSTOMERS din schema SH cu o interogare de tipul:
SELECT cust_id, cust_gender, cust_marital_status, cust_income_level
FROM customers;
Fiecare intrare in harta de biti corespunde unei linii din tabel. De exemplu, liniile cu
marital_status=’divorced’ au in harta 1 pe coloana respectiva.
Indexii de tip bitmap creati sunt folosit la o interogare de tipul: „Cati clienti casatoriti au
nivelul de venituri de tipul G sau H ?”
7
Indexii de tip bitmap proceseaza eficient acest tip de interogare prin folosirea hartii de biti
ca in figura urmatoare:
4. Gestionarea indexilor.
Un index se poate modifica sau sterge fara a influenta datele din tabela de baza sau
continutul interogarilor deja create. La stergerea unei tabele toti indexii asociati sunt stersi
automat.
Modificarea parametrilor unui index se executa cu instructiunea ALTER INDEX.
Exemplu:
8
5. Exercitii.
3) Afisati produsele comandate in lunile de vara ale anului 1986. Se vor afisa informatiile din
comanda, numele clientului, orasul, statul si limita de credit, numele agentului si numele
departamentului din care face parte, precum si liniile de detaliu (numele produsului, cantitate,
pretul si valoarea). Creati indexii necesari si apoi sa-i afisati din dictionarul de date.
4) La interogarea anterioara filtrati liniile de comanda care au valoare mai mare decat 400, unde
valoarea se calculeaza ca produs intre cantitate si pret. Creati un index corespunzator pentru
optimizarea accesului.
5) Pe baza tabelelor PRODUCT, CUSTOMER, ORD, ITEM, creati o tabela fapta (“fact”),
numita ORDITEM care sa contina datele din tabelele ORD si ITEM si care sa aiba coloanele:
custid, prodid, orderdate, commplan, shipdate, qty, actualprice si itemtot. Creati indexi
necesari:
- unic compus pentru client, produs;
- creati un index de tip bitmap pentru coloanele candidate;
- lansati o serie de interogari care sa utilizeze indexii creati;
6) Afisati suma vanzarilor pe primul trimestru al anului 1998 pentru clientii din Europa de vest
si America de sud (tabelele SALES, CUSTOMERS, COUNTRIES, TIMES).
Creati indexii necesari si sa-i afisati din dictionarul de date.