Upload
antoniu-stan
View
245
Download
2
Embed Size (px)
Citation preview
7/22/2019 Proiect SQL Avansat- Stefan Stan
1/29
Academia de Studii Economice
Facultatea de Cibernetic, Statistic i Informatic Economic
SISTEME DE BAZE DE DATEProiect SQL Avansat
Indrumtor: Lect.Univ. Dr. Anda Belciu
Student: Stan tefan Antoniu
Master E-Business
7/22/2019 Proiect SQL Avansat- Stefan Stan
2/29
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 treitabele: SPITALE, DOCTORI si
PACIENTI. Legturile dintre aceste tabele sunt realizate prin mai multe chei externe.
7/22/2019 Proiect SQL Avansat- Stefan Stan
3/29
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.
7/22/2019 Proiect SQL Avansat- Stefan Stan
4/29
Sa se afiseze numarul total de pacienti care au fost consultati inainte de cel current, pentru fiecare
spital
.
7/22/2019 Proiect SQL Avansat- Stefan Stan
5/29
Sa se afiseze salariul minim si maxim al doctorilor din acelasi spital.
7/22/2019 Proiect SQL Avansat- Stefan Stan
6/29
Sa se afiseze salariul minim, respectiv maxim al doctorilor din acelasi spital,
cu salarii mai mari sau egale cu cel curent.
7/22/2019 Proiect SQL Avansat- Stefan Stan
7/29
Sa se afiseze numarul total de doctori, indiferent de spital, care castiga cu +/-1000 fata de cel current
7/22/2019 Proiect SQL Avansat- Stefan Stan
8/29
Sa se afiseze salariul mediu al doctorilor din acelasi spital intre care exista diferenta de salariu de +/-
1000 fata de cel curent.
7/22/2019 Proiect SQL Avansat- Stefan Stan
9/29
Sa se afiseze pretul mediu al consultatiei, inaintea celui curent, in cadrul aceluiasi spital
7/22/2019 Proiect SQL Avansat- Stefan Stan
10/29
Sa se afiseze pretul mediu al consultatiei, dupa cel curent, din acelasi spital
7/22/2019 Proiect SQL Avansat- Stefan Stan
11/29
Sa se afiseze salariul mediu din fiecare spital, comparat cu salariul fiecarui doctor
7/22/2019 Proiect SQL Avansat- Stefan Stan
12/29
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
7/22/2019 Proiect SQL Avansat- Stefan Stan
13/29
b) Interogare folosind algoritmul Hash
COST = 5
TASK COMPLETED = 0.021
c) Interogare folosind algoritmul Nested Loops
COST = 2
TASK COMPLETED = 0.011
7/22/2019 Proiect SQL Avansat- Stefan Stan
14/29
d) Interogare folosind algoritmul Sort Merge Joins
COST = 3
TASK COMPLETED = 0.015
e) Interogari folosind algoritmii Outer JoinE.1 Interogare outer join fara algoritm
7/22/2019 Proiect SQL Avansat- Stefan Stan
15/29
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
7/22/2019 Proiect SQL Avansat- Stefan Stan
16/29
7/22/2019 Proiect SQL Avansat- Stefan Stan
17/29
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.
7/22/2019 Proiect SQL Avansat- Stefan Stan
18/29
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 :
7/22/2019 Proiect SQL Avansat- Stefan Stan
19/29
Cerere de regasire folosind index :
7/22/2019 Proiect SQL Avansat- Stefan Stan
20/29
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_3tabela 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 values less than (4000),
partition QT4 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)
7/22/2019 Proiect SQL Avansat- Stefan Stan
21/29
(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 :
7/22/2019 Proiect SQL Avansat- Stefan Stan
22/29
Interogari pe baza partitiilor :
I) Sa se afiseze toti doctorii care au salariul intre 1500 si 2500. (fara a utiliza partitiile)
7/22/2019 Proiect SQL Avansat- Stefan Stan
23/29
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.
7/22/2019 Proiect SQL Avansat- Stefan Stan
24/29
III) Sa se afiseze doctorii care au salariul intre 1000 si 2500 si lucreaza in spitalele cu codul 1,3sau 5 (fara partitii - se returneaza 6 inregistrari).
7/22/2019 Proiect SQL Avansat- Stefan Stan
25/29
7/22/2019 Proiect SQL Avansat- Stefan Stan
26/29
IV) Sa se afiseze doctorii care au salariul intre 1000 si 2500 si lucreaza in spitalele cu codul 1,3sau 5 (folosind partitia QT2 - se returneaza 6 inregistraritabela DOCTORI_P_1 nu poate fi
interogata).
7/22/2019 Proiect SQL Avansat- Stefan Stan
27/29
V) Sa se afiseze doctorii care au salariul intre 1000 si 2500 si lucreaza in spitalele cu codul 1,3sau 5 (folosind partitia QT2_1 - se returneaza 6 inregistrari tabelele DOCTORI_P_1 s
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.
7/22/2019 Proiect SQL Avansat- Stefan Stan
28/29
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 clustercreate 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) ) clusterclust1(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))clusterclust1("cod_spital");
alter table doctori_cluster add constraint fk_prod foreignkey("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.select s.cod_spital,s.denumire,d."nume",d."prenume"from spitale_cluster s, doctori_cluster dwhere s.cod_spital=d."cod_spital";
cost = 15timp = 0.083
7/22/2019 Proiect SQL Avansat- Stefan Stan
29/29