Sunteți pe pagina 1din 41

Baze de Date pentru Telecomunicaţii

Lucrarea 5
Crearea vederilor si a indecsilor

1
Cuprins:
Notiuni generale. .........................................................................................3

Folosirea Vederilor ......................................................................................4

Utilizarea simplista a vederilor...,,,,,,,,,.........................................................8

Redenumirea coloanelor... ..........................................................................12

Procesarea vederilor SQL............................................................................13

Restrictii in ceea ce priveste folosirea lui SELECT......................................16

Modificarea datelor dintr-o vedere..............................................................16

Probleme intampinate la modificarea datelor folosind vederi......................20

Aplicatii ale vederilor..................................................................................20

Vederi si securitate......................................................................................21

Folosirea vederilor in conversii...................................................................22

Simplificarea interogarilor complexe folosind vederi...................................23

Folosirea indecsilor.....................................................................................26

Ce sunt indecsii...........................................................................................26

Indexarea pe mai mult de un camp.............................................................30

Folosirea cuvantului cheie UNIQUE in asociere cu CREATE INDEX........32

Indecsii si Join-urile. ...................................................................................33

Folosirea clusterelor.....................................................................................35

Exercitiu. .....................................................................................................36

2
Notiuni generale

Obiectivul acestei lucrari este trecerea in revista a anumitor subiecte putin mai delicate
decat simpla creare a unor tabele. In cele ce urmeaza se vor prezenta doua tool-uri ale limbajului
SQL care permit prezentarea datelor intr-un alt format decat cel existent pe discul de stocare a
informatiei. Aceste doua tool-uri sunt vederile si indecsii.

O vedere este deseori numita si o tabela virtuala. Vederile sunt create utilizand
instructiunea CREATE VIEW. Dupa ce vederea a fost creata, se pot folosi urmatoarele comenzi
SQL pentru a ne referi la acea vedere:

 SELECT
 INSERT
 INPUT
 UPDATE
 DELETE

Un index reprezinta o alta modalitate de a prezenta datele existente in mod diferit fata de
cum apar ele efectiv pe hard. Anumite tipuri speciale de indecsi reordoneaza localizarea fizica a
unei intregistrari in cadrul tabelei sale. Indecsii pot fi creati in functie de o coloana dintr-o tabela
sau in functie de o combinatie de coloane din cadrul unei tabele. Cand se foloseste un index,
datele sunt prezentate utilizatorului intr-o maniera sortata, ordonata, care se poate controla cu
ajutorul instructiunii CREATE INDEX. In mod uzual se pot observa imbunatatiri substantiale de
performanta prin indexarea campurilor corecte, in mod special campurile care sunt joinate intre
diferite tabele.

Vederile si indecsii reprezinta doua obiecte total diferite dar au un lucru in comun:
ambele sunt asociate cu o tabela in baza de date curenta. Desi asocierea fiecarui obiect cu o
tabela este unica, ambele pot mari tabela, astfel evidentiind caracteristici puternice precum
query-urile predefinite.

3
Folosirea Vederilor

Se pot folosi vederi sau tabele virtuale pentru a incapsula query-uri complexe. Dupa
crearea unei vederi asupra unui set de date, acea vedere poate fi tratata ca orice alta tabela. Insa,
sunt aplicate restrictii speciale in ceea ce priveste modificarea datelor din acele vederi. Cand
datele dintr-o tabela se modifica, ceea ce se obtine interogand o vedere de asemenea se modifica.
Vederile nu ocupa spatiu in memoria fizica, astfel diferentiindu-se de tabele.

Sintaxa pentru instructiunea CREATE VIEW este:

CREATE VIEW <numele_vederii> [(coloana1, coloana2...)] AS


SELECT <numele_tabelei numele_coloanei>
FROM <numele_tabelei>

Desi sintaxa poate parea dificil de inteles, ea va fi exemplificata in numeroase randuri in


cele ce urmeaza tocmai pentru a ilustra diferitele situatii de utilizare dar si avantajele vederilor.
Setul de instructiuni prezentate mai sus au ca efect crearea unei vederi al carui nume va fi
specificat in campul “numele_vederii” si care cuprinde mai multe coloane al caror nume poate fi
de asemenea specificat. O instructiune SELECT va determina campurile si tipurile de date.

Insa inainte de a efectua operatii cu vederi, va trebui sa populam o baza de date cu


numele de CLIENTI pe care vom efectua diferite operatii. Baza de date va fi creata folosind
instructiunea:

create database CLIENTI;

Asupra acestei baze de date se vor efectua urmatoarele operatii:

a)

4
b)

5
Popularea tabelelor se va face cu instructiun de genul:

6
Ca rezultat vom avea o tabela populata precum:

7
Utilizarea simplista a vederilor

Sa presupunem ca, pentru un motiv sau altul, dorim sa creeam o vedere asupra tabelei
CLIENTI care are aceleasi caracteristici ca si tabela anterior mentionata dar dorim sa o
denumim in alt mod, spre exemplu CLIENTI. Instructiunile folosite vor fi urmatoarele:

Pentru confirmarea faptului ca aceasta instructiune a fost executata cu succes deplin,


putem trata vederea ca si cum ea ar fi o tabela:

SELECT * FROM CLIENTI;

Rezultatul va fi:

Se pot crea chiar si noi vederi folosind vederi deja existente. Totusi trebuie luat aminte
faptul ca atunci cand se creaza vederi ale vederilor, desi acest lucru este acceptabil, el complica
foarte mult mentenanta intregului sistem. Sa presupunem ca avem o vedere de nivelul trei
provenita dintr-o tabela (vederea unei vederi a unei vederi a unei tabele). Daca prima vedere ar

8
disparea ca urmare a unui DROP, celelalte doua vederi ar continua sa existe dar ar fi unitule
deoarece si-au obtinut parte din informatiile necesare din prima vedere. Este asadar de tinut
minte faptul ca o data ce o vedere a fost creata ea se comporta ca si o tabela virtuala.

Dorim sa rulam urmatoarele instructiuni:

Rezultatul va fi:

Nota: Am considerat clientii premium ca fiind cei cu valoarea abonamentului de 25.

Instructiunea CREATE VIEW permite de asemenea selectarea coloanelor individuale


dintr-o tabela si plasarea lor intr-o vedere. Urmatorul exemplu selecteaza campurile NUME,
PRENUME, CNP, si VALOARE_ABONAMENT din tabela CLIENTI.

9
Rezultatul va fi:

Utilizatorii pot crea vederi pentru interogarea diferitelor date. Sa presupunem ca avem o
tabela cu 50 de coloane si sute de mii de linii dar dorim sa vedem datele a doar 2 coloane. Putem
crea o vedere pe acele doua coloane si apoi, interogand vederea, se va observa o diferenta
remarcabila in ceea ce priveste timpul cat dureaza pentru ca rezultatele interogarii sa fie
returnate.

10
Redenumirea Coloanelor
Vederile simplifica reprezentarea datelor. Pe langa denumirea vederii, sintaxa SQL
pentru instructiunea CREATE VIEW permite redenumirea coloanelor selectate. Sa consideram
exemplul precedent. Sa presupunem ca dorim sa combinam campurile NUME si PREMUME din
tabela CLIENTI. Urmatorul exemplu ilustreaza exact acest lucru. Exemplul foloseste operatorul
SQL + pentru a combina campurile.

Rezultatul va fi:

Sintaxa SQL obliga la introducerea unui nume pentru campul virtual oridecateori acesta
este creat in cadrul unei vderi folosint operatori sau o functie SQL. Aceasta procedura este logica
deoarece nu dorim un nume de coloana de genul COUNT(*) or AVG(PAYMENT).

11
Procesarea vederilor SQL
Vederile pot reprezenta date din tabele intr-un mod mult mai convenabil fata de ceea ce
deja exista in structura bazei de date existente. Vederile pot fi de asemenea extrem de utile
pentru efectuarea catorva interogari complexe in serie. Sa presupunem ca avem un query care se
intalneste des. Spre exemplu sa consideram ca dorim in mod curent sa unim tabelul CLIENTI cu
tabelul FACTURI pentru a obtine diverse informatii. Acest proces poate fi compactat intr-o
simpla vedere folosind urmatoarele instructiuni:

Daca von interoga FACTURI_EMISE folosind o conditie:

Rezultatul va fi:

12
SQL foloseste mai multi pasi pentru a procesa instructiunile anterioare. Deoarece
FACTURI_EMISE este o vedere ci nu este o tabela, SQL ca cauta initial o tabela cu acest nume
si nu va gasi nimic. Procesorul SQL va afla apoi de la o tabela de sistem faptul ca
FACTURI_EMISE este defapt o vedere. Apoi va folosi planul vederii pentru a construi
urmatoarea interogare:

Exemplu: Se va construi o vedere ce afiseaza toate HLR-urile in care se regasesc clienti


catre care se emit facturi. De asemenea se vor afisa sumele totale si numarul total de facturi catre
un persoane dintr-un anumit HLR.

Rezultatul va fi:

13
Exemplu 2: Sa presupunem ca tuturor abonatilor nostri li se propune un discount de 10% in
aceasta luna. Dorim sa vedem efectul care aceasta modificare o va avea asupra veniturilor pe
luna in curs

Acest join este unul simplu. Totusi prin acest exemplu se va putea evidentia utilitatea folosirii
vederilor. Putem scadea cei 10% instant si ii putem prezenta ca un camp in cadrul vederii. Din
acel punct, se pot selecta inregistrari din vedere si acele inregistrari vor avea deja scazute cele 10
procente de discount. Instructiunile ar fi urmatoarele.

Rezultatul va fi:

14
Restrictii in ceea ce priveste folosirea lui SELECT
SQL impune anumite restrictii in ceea ce priveste folosirea instructiunii SELECT in
crearea vederilor. Urmatoarele doua reguli se aplica in folosirea instructiunii SELECT:

1) Nu se poate folosi operatorul UNION


2) Nu se poate utiliza clauza ORDER BY. Insa se poate utiliza GROUP BY intr-o vedere
pentru a efectua aceleasi functii pe care le are clauza ORDER BY.

Modificarea datelor dintr-o vedere


In momentul creerii unei vederi asupra uneia sau mai multora tabele dintr-o baza de date,
se pot crea tabele virtuale pentru utilizarea in scripturi SQL sau intr-o aplicatie pe baze de
date. Dupa crearea unei vederi folosind CREATE VIEW... SELECT etc. se pot modifica,
insera sau sterge date folosind instructiunile UPDATE, INSERT si DELETE.

Exemplu3: Vom continua cele spuse in exemplul 2 si vom actualiza tabela CLIENTI pentru a
reflecta acel discount de 10%.

15
Rezultatul va fi:

16
Acum vom verifica daca baza de date a fost sau nu actualizata:

Rezultatul va fi:

Apoi vom sterge un rand din vedere:

17
;

Rezultatul va fi:

Ultimul pas este testarea functiei de UPDATE.

18
Rezultatul va fi:

Probleme intampinate la modificarea datelor folosind


vederi
Deoarece ceea ce se vede folosind o vedere poate fi un set dintr-un grup de tabele,
modificarea datelor din tabelele aferente nu este intotdeauna simpla. Urmatoarea lista este una a
celor mai comune restrictii ce vor fi intampinate in lucrul cu vederi:

1) Nu se poate folosi DELETE pe mai multe vederi


2) Nu se poate folosi INSERT decat in situatia in care toate coloanele NOT NULL folosite
in tabelele asociate sunt incluse in vedere. Aceasta restrictie se aplica deoarece procesorul
SQL nu stie ce valoare sa insereze in coloanele NOT NULL
3) Daca se insereaza sau se actualizarea inregistrari folosint un join view, toate inregistrarile
ce sunt actualizate trebuie sa apartina aceleiasi tabele fizice
4) Daca se foloseste clauza DISTINCT pentru a crea o vedere, nu se poate actualiza sau
insera in acea vedere
5) Nu se poate actualiza o coloana virtuala (coloana care este rezultatul unei expresii sau
unei functii)

Aplicatii ale vederilor


Vederile pot fi utile in urmatoarele situatii:

1) Oferirea de functii de securitate


2) Conversia intre diferite unitati
3) Crearea unui nou format al unei tabele virtuale
4) Simplificarea constructiei query-urilor complexe

19
Vederi si securitate
Toate sistemele de baze de date relationale folosite in ziua de astazi contin o suita de
caracteristicii de securitate. Utilizatorii sistemului de baze de date sunt deobicei impartiti in
grupe bazate pe utilizarea bazei de date. Tipuri de grupuri des intalnite sunt: administratorii de
baze de date, dezvoltatorii de baze de date, personalul responsabil cu introducerea de date si
utilizatorii publici. Aceste grupuri de utilizatori au diferite grade de privilegii asupra bazei de
date. Administratorul deobicei are control complet asupra sistemului, incluzand privilegii de
UPDATE, INSERT, DELETE si ALTER. Grupul public poate avea doar privilegii de SELECT
asupra intregii baze de date sau doar asupra unor tabele.

Vederile sunt deobicei utilizate in aceasta situatie pentru a controla informatia la care are
acces utilizatorul de baze de date. De exemplu, daca dorim ca utilizatorii sa aiba acces doar la
campul NUME al tabelei CLIENTI, atunci se poate crea vederea NUME_CLIENT.

20
O persoana cu drepturi de administrator de sistem poate oferi grupului public drepturi de
SELECT asupra vederii NUME_ABONAT. Acest grup nu va avea privilegii asupra tabelei
asociate ABONATI.

Folosirea vederilor in conversii


Vederile sunt de asemenea foarte utile in situatii in care trebuie sa prezentam
utilizatorului date care sunt diferite de datele ce exista defapt in baza de date. De exemplu, daca
capul VALOARE_FACTURA este defapt stocat in USD si noi il dorim afisat in EURO vom
efectua urmatoarele instructiuni.

21
Rezultatul va fi:

In cazul conversiilor trebuie avut in vedere posibilele probleme inerente in modificarea


datelor din tabela originala in cazul in care se efectueaza diferite operatii matematice.

Simplificarea query-urilor complexe folosind vederi


Vederile sunt de asemenea utile in situatii ce presupun efectuarea unor secvente de query-
uri pentru a ajunge la un rezultat. Urmatorul exemplu ilustreaza folosirea unei vederi in aceasta
situatie.

Pentru a afisa numele tuturor bancilor catre care compania noastra a efectuat plati in
judetul Arges cu o suma mai mica de 5000 de EURO, problema se va sparge in doua parti:

1) Obtinerea tuturor platilor emise pentru BUC1


2) Obtinerea tuturor platilor cu o suma mai mica de 30

Vom rezolva problema folosind doua vederi PLATI1 si PLATI2

22
Deoarece dorim sa gasim toate facturile emise pentru BUC1 si toate platile mai mici de 30 putem
folosi clauza IN pentru a gasi care plati din PLATI1 au fost emise pentru BUC1. Vom folosi
aceasta informatie pentru a crea o noua vedere numita PLATI3,

23
Apoi vom combina query-ul precedent cu tabela de PLATI pentru a satisface cerinta initiala.

Rezultatul va fi:

24
Folosirea indecsilor
Un alt mod de reprezentare a datelor in alt format decat cel existent fizic pe suportul
hardware este folosirea indecsilor. Indecsii pot de asemenea sa reordoneze datele stocate pe disc.

Indecsii sunt folositi in bazele de date SQL din 3 considerente:

1) Pentru a intari constrangerile referentiale de integritate prin folosirea cuvantului cheie


UNIQUE
2) Pentru a facilita reordonarea datelor bazata pe continutul campului index sau
campurilor index
3) Pentru a optimiza viteza de executie a query-urilor

Ce sunt indecsii?
Datele pot fi obtinute dintr-o baza de date folosind doua metode. Prima metoda, deseori
denumita Metoda de Acces Secvential, presupune trecerea prin fiecare inregistrare pentru a gasi
inregistrarea potrivita. Aceasta metoda este ineficienta dar este singura prin care SQL poate sa
localizeze inregistrarea corecta. Un exemplu bun ar fi cel al vechilor biblioteci care aveau un
catalog de sortare. Sa presupunem ca bibliotecarul a luat toate cardurile alfabetice de indexare si
le-a aruncat in sus apoi le’a pus inapoi in cabinetii initiale. Cand am fi dorit sa cautam locatia
unei anumite carti, probabil am fi inceput de la inceputul indecsilor apoi treptat am fi gasit
informatia dorita. Acuma sa presupunem ca bibliotecarul a sortat titlurile cartilor alfabetic. In
acest mod am avea acces rapid la acea carte folosindu-ne de cunostintele noastre despre alfabet.
Sa ne imaginam totusi flexibilitatea de care beneficiem daca bibliotecarul ar fi fost intr-atat de
zelos incat nu doar sa sorteze cartile dupa titlu dar si sa creeze un alt catalog sortat dupa numele
autorului si un alt catalog sortat dupa subiectul abordat in carte. Acest proces ar oferi cititorului o
foarte mare flexibilitate in ceea ce priveste obtinerea informatiei dorite. De asemenea, cititorul ar
fi in stare sa obtina informatia dorita in mult mai putin timp decat in cazul initial.

Adaugarea indecsilor unei baze de date permite SQL-ului sa foloseasca Metoda de Acces
Direct. SQL foloseste o structura arborescenta pentru a stoca si a oferi datele despre indecsi.
Pointer catre un grup de date sunt stocati in nodul radacina a structurii arborescente. Fiecare nod
contine pointeri catre alte noduri. Pointerii din dreapta indica valori mai mari decat nodul parinte.

Sistemul de baze de date isi incepe cautarea la nodul radacina si pur si simplu urmeaza
pointerii pana cand gaseste informatia necesara.

Sintaxa de baza SQL pentru a crea indecsi este:

25
SQL> CREATE INDEX nume_index
2 ON nume_tabel(nume_coloana1, [nume_coloana2], ...);

Sintaxa pentru CREATE INDEX poate varia in functie de diversele sisteme de baze de
date. Spre exemplu sindaxa pentru CREATE INDEX sub Oracle7 este aceasta:

CREATE INDEX [schema.]index


ON { [schema.]table (column [!!under!!ASC|DESC]
[, column [!!under!!ASC|DESC]] ...)
| CLUSTER [schema.]cluster }
[INITRANS integer] [MAXTRANS integer]
[TABLESPACE tablespace]
[STORAGE storage_clause]
[PCTFREE integer]
[NOSORT]

Sindaxa pentru CREATE INDEX folosind Sybase SQL Server este urmatoarea:

create [unique] [clustered | nonclustered]


index index_name
on [[database.]owner.]table_name (column_name
[, column_name]...)
[with {fillfactor = x, ignore_dup_key, sorted_data,
[ignore_dup_row | allow_dup_row]}]
[on segment_name]

In timp ce Informix SQL impementeaza comanda in felul urmator:

CREATE [UNIQUE | DISTINCT] [CLUSTER] INDEX index_name


ON table_name (column_name [ASC | DESC],
column_name [ASC | DESC]...)

Este de notat faptul ca toate aceste implementari au cateva lucruri in comun incepand cu
formatiunea de baza:

CREATE INDEX index_name ON table_name (column_name, ...)

Un prim exemplu ar fi crearea unui index pe campul CNP al tabelei CLIENTI.


Instructiunea ar arata in felul urmator:

26
Tabela CLIENTI este sortata dupa campul CNP pana cand se renunta la index folosind
DROP INDEX. Ca deobicei, instructiunea DROP INDEX este foarte simpla.

27
In acest moment tabela CLIENT este in forma ei originala. Folosind cea mai simpla
forma a instructiunii CREATE INDEX nu s-a schimbat in mod fizic modul de sortare al tabelei.
Se poate pune insa problema de ce sistemele de baze de date ofera posibilitatea indexarii daca ele
de asemenea permit clauze precum ORDER BY.

Instructiunea SELECT si indexul ID_INDEX din tabela BILLS genereaza acelasi


rezultat. Diferenta este ca ORDER BY resorteaza si ordoneaza datele de fiecare data cand se
executa statementul SQL corespunzator. Cand se foloseste un index, sistemul de baze de date
creaza un obiect index fizic si refoloseste acelasi index de fiecare data cand se interogheaza
tabela.

Cand se renunta la o tabela prin instructiunea DROP, se renunta de asemenea la toti


indecsii asociati cu tabela respectiva.

In cele ce urmeaza se vor prezenta cateva sfaturi in ceea ce priveste utilizarea indecsilor:

1) Pentru tabele mici, indecsii nu ofera cresteri de performanta semnificative


2) Indecsii produc cele mai mai cresteri de performanta in momentul in care coloanele
indexate contin o varietate de date sau mai multe valori de tip NULL

28
3) Indecsii pot optimiza interogarile tabelelor in cazul in care acele interogari returneaza un
volum mic de date (deobicei mai putin de 25% din volumul total de date). Daca se
returneaza un volum mai mare de date in mod constant, indecsii nu sunt eficienti
4) Indecsii pot mari viteza de returnare a datelor. Totusi, ei reduc viteza de actualizare a
datelor. Acest lucru trebuie avut in vedere in momentul in care avem de a face cu o tabela
ce se actualizeaza des. Pentru actualizari de un volum foarte mare, este de considerat
solutia renuntarii la indecsi inainte de operatia de actializare. Cand actualizarea este
completa, o simpla reconstructie a indescilor va rezolva problema.
5) Indecsii ocupa spatiu in cadrul bazei de date considerate. In cazul folosirii unui sistem de
management al bazelor de date care permite managerierea spatiului de pe disc ocupat de
catre baza de date considerata, trebuie avuta in vedere dimensiunea indecsilor in
momentul planificarii dimensiunii bazei de date
6) Intotdeauna indecsati campurile care sunt folosite in operatii de JOIN intre tabele.
Aceasta tehnica poate spori in mod dramatic viteza acelui JOIN
7) Majoritatea sistemelor de baze de date nu permit crearea indecsilor peste vederi
8) Este de evitat indexarea campurilor care sunt actualizate sau modificate in mod regulat.
Overheadul necesar pentru a actualiza in mod constant indexul va anula orice eventual
spor de performanta ca urmare a acestei operatii
9) Nu stocati indecsii si tabelele pe acelasi drive fizic. Separarea acestor obiecte va elimina
conflictele si va avea ca rezultat interogari mai rapide

Indexarea pe mai mult de un camp


SQL permite de asemenea indexarea pe unul sau mai multe campuri. Acest timp de index
este unul compus. Urmatorul cod ilustreaza un index complus. Este de notat faptul ca desi cele
doua campuri sunt combinate, se creaza doar un singur index din punct de vedere fizic (numit
ID_COMP_INDEX).

Se pot obtine sporuri de performanta prin selectarea coloanei cu cele mai multe valori
unice. De exemplu, fiecare valoare din capul NUME al tabelei CLIENTI este unica. Cand se
foloseste un index compus, se plaseaza cel mai selectiv camp primul in lista de coloane. Acest

29
lucru inseamna plasarea pe prima pozitie a campului ce se crede a fi cel mai “unic”. Ordinea in
care numele de coloane apar in statement-ul CREATE INDEX nu trebuie sa fie aceeasi ca cea
din cadrul tabelului considerat. Sa presupunem ca folosim in mod constant o instructiune
precum:

Pentru a obtine sporul de performanta, trebuie creat un index folosind campul NUME ca
fiind primul in acea lista. De exemplu:

sau

30
Campul NUME este cel mai din stanga camp pentru ambii indecsi astfel incat interogarea
precedenta sa fie otpimizata pentru a cauta pe informatia pe campul NUME.

Indecsii compusi sunt de asemenea utilizati pentru a combina doua sau mai multe coloane
care, de unele singure, pot avea selectivitate redusa. Pentru un exemplu de selectivitate, putem
privi la tabela FACTURI.

Folosirea cuvantului cheie UNIQUE in asociere cu


CREATE INDEX
Indecsii compusi sunt deseori folositi impreuna cu cuvantul cheie UNIQUE pentru a evita
situatii in care multiple inregistrari apar cu aceleasi date. Sa presupunem ca dorim sa fotam
tabela CLIENTI sa contina urmatoarea regula. Fiecare factura platita catre o companie trebuie sa
provina de la un cont bancar diferit. Va trebuie sa creem un index UNIQUE pe campurile NUME
si CNP. Din pacate, Oracle7 nu suporta sintaxa UNIQUE. In schimb el implementeaza
caracteristica de UNIQUE folosind constrangerea de integritate UNIQUE. Urmatorul exemplu
demonstreaza folosirea cuvantului cheie UNIQUE impreuna cu CREATE INDEX.

Apoi se incearca inserarea unei inregistrari in tabela CLIENTI care sa duplicheze o data
care deja exista.

31
Acest lucru rezulta in primirea unui mesaj de eroare ce ne indica faptul ca instructiunea
INSERT nu a fost permisa.

Exemplu: Crearea unui index in tabela CLIENTI care va sorta campui


VALOARE_ABONAMENT in ordine descrescatoare.

SQL> CREATE INDEX DESC_AMOUNT ON BILLS(AMOUNT DESC);


SQL> SELECT * FROM BILLS;

Indecsii si Join-urile
Cand se folosesc join-uri complicate in interogari, instructiunea SELECT poate dura
foarte mult timp. Cand avem de a face cu tabele de dimensiuni mari, acest timp se poate apropia
de cateva secunde. Acest tip de performatna intr-un mediu client/server cu mai multi utilizatori
poate deveni extrem de frustrant pentru utilizatorii aplicatiei curente. Crearea unui index bazat pe
campuri care sunt frecvent utilizate in join-uri poate optimiza performata interogarii in mod
substantial. Totusi, daca sunt creati prea multi indecsi, ei pot incetini viteza de lucru a sistemului
mai degraba decat a o mari. Se recomanda experimentarea utilizarii indecsilor pe mai multe
tabele de dimensiuni mari. Acest tip de experiment conduce catre o mai buna intelegere a
optimizarii statement-urilor SQL.

Urmatorul exemplu creaza un index bazat pe campul CNP din tabelele CLIENTI si
FACTURI.

32
Acest exemplu a creat mai intai un index pentru ACCOUNT_ID din ambele tabele
considerate. Prin crearea indecsilor pentru ACCOUNT_ID pe fiecare tabela, join-ul poate accesa
mai rapid anumite randuri de date. Ca regula, trebuie indexate coloanele unei tabele care sunt
unice.

33
Folosirea clusterelor
Desi s-a spus initial ca indecsii pot fi folositi pentru a prezenta o vedere a unei tabelei ce
este diferita de cea fizic existenta, acest lucru nu este in totalitate corect. Un tip special de index
suportat de multe sisteme de baze de date permite managerului de baze de date sau
dezvoltatorului sa grupeze date. Cand se folosesc indecsi clustered, aranjamentul fizic al datelor
din cadrul unei tabele este modificat. Folosirea unui index clustered deobicei implica returnarea
mai rapida a datelor fata de folosirea unui index traditional, nonclustered. Insa, multe sisteme de
baze de date permit doar un singur index clustered per tabela. Campul utilizat pentru a crea
indexul clustered este campul cheie primara. Folosind Sybase Transact-SQL, se poate crea un
index unic clustered pe campul CNP al tabelei FACTURI folosind urmatoarea sintaxa:

create unique clustered index id_index


on FACTURI(UID_FACTURI)
go

Oracle trateaza conceptul de clustere in mod diferit. Folosind bazele de date relationale
Oracle, un cluster este un obiect al bazei de date precum o tabela. Un cluster este folosit pentru a
stoca tabele cu campuri comune astfel incat viteza de acces este marita. Aceasta este sintaxa
pentru crearea unui cluster folosind Oracle7

CREATE CLUSTER [schema.]cluster


(column datatype [,column datatype] ... )
[PCTUSED integer] [PCTFREE integer]
[SIZE integer [K|M] ]
[INITRANS integer] [MAXTRANS integer]
[TABLESPACE tablespace]
[STORAGE storage_clause]
[!!under!!INDEX
| [HASH IS column] HASHKEYS integer]

34
Exercitiu
Sa se creeze doua tabele ECHIPAMENT si ALARME cu urmatoarele coloane:

- ECHIPAMENT: ID_ECH, TIP_ECH, FURNIZOR, LOCATIE,


IMPORTANTA_STRATEGICA
- ALARME: ID_ALARMA, TEXT_ALARMA, ID_ECH_DEFECT, DATA_APARITIE,
GRAD_ALARMA

Cerinte:

a) sa se populeze cele doua tabele

b) sa se creeze o vedere asupra echipamentelor din retea care sa contina doar ID_ECH si
LOCATIE

c) sa se creeze o vedere asupra alarmelor din retea care sa contina doar: ID_ALARMA,
TEXT_ALARMA, ID_ECH_DEFECT si GRAD_ALARMA

d) sa se creeze o vedere a vederii alarmelor anterioare care sa contina doar alarmele de grad
‘Critical’

e) sa se creeze un index pe baza ID_ALARMA

f) sa se creeze un index pe baza GRAD_ALARMA si ID_ALARMA

35
36
a) Pentru ECHIPAMENTE

Rezulta tabelul:

Pentru ALARME

37
Rezulta tabelul:

b)

Iar rezultatul este:

38
c)

Iar rezultatul este:

d)

39
Rezultatul este:

e)

Rezultatul fiind:

f)

40
Rezultatul este:

41

S-ar putea să vă placă și