Proiect SQL Avansat - Stefan Stan
Proiect SQL Avansat - Stefan Stan
Proiect SQL Avansat - Stefan Stan
Indrumtor: Lect.Univ. Dr. Anda Belciu Student: Stan tefan Antoniu Master E-Business
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.
Sa se afiseze numarul total de pacienti care au fost consultati inainte de cel current, pentru fiecare 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
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 = 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.
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.
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)
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;
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)
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