Sunteți pe pagina 1din 29

Academia de Studii Economice Facultatea de Cibernetic, Statistic i Informatic Economic

SISTEME DE BAZE DE DATE


Proiect SQL Avansat

Indrumtor: Lect.Univ. Dr. Anda Belciu Student: Stan tefan Antoniu Master E-Business

1. Descrierea bazei de date si schema conceptuala

Tabelele create formeaz o baz de date care ajut la monitorizarea activitii celor mai mari si importante spitale din Bucuresti si din tara. Baza de date este format din trei tabele: SPITALE, DOCTORI si PACIENTI. Legturile dintre aceste tabele sunt realizate prin mai multe chei externe.

2- Exerciii cu funcii analitice


Sa se afiseze numarul total de doctori si suma salariilor acestora, din fiecare spital, pentru doctorii care castiga cu +/- 1500 fata de cel current.

Sa se afiseze numarul total de pacienti care au fost consultati inainte de cel current, pentru fiecare spital

Sa se afiseze salariul minim si maxim al doctorilor din acelasi spital.

Sa se afiseze salariul minim, respectiv maxim al doctorilor din acelasi spital, cu salarii mai mari sau egale cu cel curent.

Sa se afiseze numarul total de doctori, indiferent de spital, care castiga cu +/-1000 fata de cel current

Sa se afiseze salariul mediu al doctorilor din acelasi spital intre care exista diferenta de salariu de +/1000 fata de cel curent.

Sa se afiseze pretul mediu al consultatiei, inaintea celui curent, in cadrul aceluiasi spital

Sa se afiseze pretul mediu al consultatiei, dupa cel curent, din acelasi spital

Sa se afiseze salariul mediu din fiecare spital, comparat cu salariul fiecarui doctor

3.Aplicarea algoritmilor de optimizare a cererilor de regsire


Sa se afiseze numele, prenumele si salariul doctorilor din fiecare spital. Interogarea returneaza de fiecare data 26 de inregistrari. a) Interogare fara algoritm

COST = 2 TASK COMPLETED = 0.01

b) Interogare folosind algoritmul Hash

COST = 5 TASK COMPLETED = 0.021 c) Interogare folosind algoritmul Nested Loops

COST = 2 TASK COMPLETED = 0.011

d) Interogare folosind algoritmul Sort Merge Joins

COST = 3 TASK COMPLETED = 0.015 e) Interogari folosind algoritmii Outer Join E.1 Interogare outer join fara algoritm

COST = 3 TASK COMPLETED = 0.015 E.2 Interogare outer join folosind algoritmul Nested Loops

COST = 3 TASK COMPLETED = 0.018 E.3 Interogare outer join folosind algoritmul Hash

COST = 5 TASK COMPLETED = 0.02

E.4 Interogare outer join folosind algoritmul Sort Merge

COST = 3 TASK COMPLETED = 0.02 Avand in vedere ca baza de date utilizata pentru aceste exemple este una de dimensiuni reduse, se observa in ambele cazuri ca algoritmul cel mai eficent in cererile de regasire este algoritmul Nested Loops.

4. Aplicarea tehnicilor de indexare


Sa se afiseze toti doctorii al caror nume incepe cu litera S. Cererea de regasire fara un index :

Cererea de regasire cu index :

Se observa faptul ca interogarea fara index genereaza un cost egal cu 2, pe cand cea care utilizeaza un index genereaza un cost egal cu 0.

Sa se afiseze toate informatiile, inclusiv denumirea spitalului in care lucreaza, despre doctorii care au salariul intre 2500 si 7000.

Cerere de regasire fara index :

Cerere de regasire folosind index :

5. Aplicarea tehnicilor de partiionare


Pentru evidentierea tehnicilor de partitionare au fost create trei tabele : DOCTORI_P_1 tabela nepartitionata, DOCTORI_P_2 tabela care contine patru partitii in functie de salariul doctorilor si DOCTORI_P_3 tabela care e partitionata in functie de salariul doctorilor si subpartitionata in functie de spitalul in care lucreaza fiecare dintre acestia.

CREATE TABLE "DOCTORI_P_1"("COD_DOCTOR" NUMBER PRIMARY KEY, "nume" VARCHAR2(40), "prenume" VARCHAR2(60), "salariu" number(5), "cost_consultatie" NUMBER(4), "COD_SPITAL_A" number(4));

CREATE TABLE "DOCTORI_P_2"("COD_DOCTOR" NUMBER PRIMARY KEY, "nume" VARCHAR2(40),"prenume" VARCHAR2(60), "salariu" number(5), "cost_consultatie" NUMBER(4), "COD_SPITAL_A" number(4)) partition by range ("salariu") (partition QT1 values less than (1000),

partition QT2 values less than (2500), partition QT3 partition QT4 values less than (4000), values less than (10000));

CREATE TABLE "DOCTORI_P_3"("COD_DOCTOR" NUMBER PRIMARY KEY, "nume" VARCHAR2(40), "prenume" VARCHAR2(60), "salariu" number(5), "cost_consultatie" NUMBER(4), "COD_SPITAL_A" number(4)) partition by range ("salariu") subpartition by list (cod_spital_a) (partition QT1 values less than (1000)

(subpartition QT1_1 values (1,2,3,4,5), subpartition QT1_2 values (6,7,8,9,10)), partition QT2 values less than (2500) (subpartition QT2_1 values (1,2,3,4,5), subpartition QT2_2 values (6,7,8,9,10)), partition QT3 values less than (4000)

(subpartition QT3_1 values (1,2,3,4,5), subpartition QT3_2 values (6,7,8,9,10)), partition QT4 values less than (10000)

(subpartition QT4_1 values (1,2,3,4,5), subpartition QT4_2 values (6,7,8,9,10)));

Aceste tabele au fost populate cu inregistrarile din tabela DOCTORI. Insert into doctori_p_1 select * from doctori; Insert into doctori_p_2 select * from doctori; Insert into doctori_p_3 select * from doctori;

Partitiile din tabelele DOCTORI_P_2 si DOCTORI_P_3 pot fi vizualizate :

Interogari pe baza partitiilor : I) Sa se afiseze toti doctorii care au salariul intre 1500 si 2500. (fara a utiliza partitiile)

Se observa ca nu exista diferente intre rezultate. II) Sa se afiseze toti doctorii care au salariul intre 1500 si 2500. (utilizand partitia QT2)

Obs ! Tabela DOCTORI_P_1 nu poate fi verificata pentru ca nu este partitionata.

III)

Sa se afiseze doctorii care au salariul intre 1000 si 2500 si lucreaza in spitalele cu codul 1,3 sau 5 (fara partitii - se returneaza 6 inregistrari).

IV)

Sa se afiseze doctorii care au salariul intre 1000 si 2500 si lucreaza in spitalele cu codul 1,3 sau 5 (folosind partitia QT2 - se returneaza 6 inregistrari tabela DOCTORI_P_1 nu poate fi interogata).

V)

Sa se afiseze doctorii care au salariul intre 1000 si 2500 si lucreaza in spitalele cu codul 1,3 sau 5 (folosind partitia QT2_1 - se returneaza 6 inregistrari tabelele DOCTORI_P_1 si DOCTORI_P_2 nu pot fi interogate).

Rezultatele obtinute nu sunt cele mai elocvente din cauza dimensiunilor reduse ale bazei de date si a numarului redus de inregistrari. Se poate observa totusi faptul ca interogarile sunt mai eficiente pentru tabela DOCTORI_P_3 care contine sub-partitii. Aproape la acelasi nivel de eficienta este si tabela DOCTORI_P_2 care contine patru partitii si cea mai putin eficienta este tabela DOCTORI_P_1, care nu este partitionata.

6. Aplicarea clusterizrii
I) Crearea clusterului si a indexului :

create cluster clust1 (cod_spital number(4)); create index idx_cluster on cluster clust1; II) Crearea si popularea tabelelor in cluster

create table spitale_cluster (cod_spital number(4) primary key, denumire varchar2(50), oras varchar2(30), nr_angajati number(4), nr_doctori number(4), capacitate_maxima number(4) ) cluster clust1(cod_spital); create table doctori_cluster(cod_doctor number(4), "nume" VARCHAR2(40),"prenume" VARCHAR2(60), "salariu" number(5), "cost_consultatie" NUMBER(4), "cod_spital" number(4))cluster clust1("cod_spital"); alter table doctori_cluster add constraint fk_prod key("cod_spital") references spitale_cluster(cod_spital); Insert into spitale_cluster select * from spitale; Insert into doctori_cluster select * from doctori; III) Sa se afiseze numele si prenumele doctorilor, dar si denumirea spitalului unde lucreaza. foreign

select s.cod_spital,s.denumire,d."nume",d."prenume" from spitale_cluster s, doctori_cluster d where s.cod_spital=d."cod_spital"; cost = 15 timp = 0.083