Documente Academic
Documente Profesional
Documente Cultură
Lucrarea 5
Crearea vederilor si a indecsilor
1
Cuprins:
Notiuni generale. .........................................................................................3
Vederi si securitate......................................................................................21
Folosirea indecsilor.....................................................................................26
Ce sunt indecsii...........................................................................................26
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.
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:
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.
Rezultatul va fi:
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:
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:
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:
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:
17
;
Rezultatul va fi:
18
Rezultatul va fi:
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.
21
Rezultatul va fi:
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:
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.
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.
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:
Sindaxa pentru CREATE INDEX folosind Sybase SQL Server este urmatoarea:
Este de notat faptul ca toate aceste implementari au cateva lucruri in comun incepand cu
formatiunea de baza:
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.
In cele ce urmeaza se vor prezenta cateva sfaturi in ceea ce priveste utilizarea indecsilor:
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
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.
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.
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:
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
34
Exercitiu
Sa se creeze doua tabele ECHIPAMENT si ALARME cu urmatoarele coloane:
Cerinte:
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’
35
36
a) Pentru ECHIPAMENTE
Rezulta tabelul:
Pentru ALARME
37
Rezulta tabelul:
b)
38
c)
d)
39
Rezultatul este:
e)
Rezultatul fiind:
f)
40
Rezultatul este:
41