Sunteți pe pagina 1din 8

ACADEMIA DE STUDII ECONOMICE, BUCUREȘTI

Facultatea de Cibernetică, Statistică și Informatică Economică

PROIECT
Managementul Bazelor de Date

Student: STOICA Maria Georgiana


Grupa 1098
TEMA 1
Exerciţiul 1:

a) Creaţi tabelele T_FURNIZORI şi T_COMENZI_APROVIZIONARE pe baza


tabelelor din schema MS_DBA;
create table T_Furnizori as select * from ms_dba.T_furnizori;

create table T_Comenzi_aprovizionare as select * from ms_dba.T_comenzi_aprovizionare;

b) Colectaţi statistici referitoare la aceste tabele;

Begin

DBMS_STATS.GATHER_TABLE_STATS (user, 'T_COMENZI_APROVIZIONARE');

DBMS_STATS.GATHER_TABLE_STATS (user, 'T_FURNIZORI');

End;

c) Creaţi o interogare pe baza acestor tabele prin care să afişaţi numele furnizorilor,
data comenzilor încheiate şi suma totală (sum(c.cantitate_primita*c.pret_unitar));
select c.NUME_FURNIZOR, cd.DATA, sum(cd.cantitate_primita*cd.pret_unitar)

from T_FURNIZORI c, T_comenzi_aprovizionare cd

where c.ID_FURNIZOR=cd.ID_FURNIZOR

group by c.NUME_FURNIZOR, cd.DATA;


d) Afişaţi planul de execuţie. Ce metodă este aleasă în mod implicit?

Exerciţiul 2:

a) Pe baza tabelelor T_FURNIZORI şi T_COMENZI_APROVIZIONARE, modificaţi


interogarea de la exerciţiul 1 astfel încât să fie afişate doar comenzile furnizorului
'LA FANTANA';
select f.NUME_FURNIZOR , a.data

from T_FURNIZORI f , T_COMENZI_APROVIZIONARE a

where f.NUME_FURNIZOR = 'LA FANTANA';

b) Observaţi planul de execuţie. Implicit este utilizat algoritmul HASH JOINS.

select /*+ USE_HASH(cd c) */

c.NUME_FURNIZOR, cd.DATA, cd.CANTITATE_COMANDATA

from T_FURNIZORI c, T_COMENZI_APROVIZIONARE cd

where c.ID_FURNIZOR= cd.ID_FURNIZOR;


c) Modificaţi planul prin directiva de execuţie astfel încât să fie utilizat algoritmul
NESTED LOOPS. Observaţi costul de execuţie.

select /*+ USE_NL (cd c)*/


c.NUME_FURNIZOR, cd.DATA, cd.CANTITATE_COMANDATA
from T_FURNIZORI c, T_COMENZI_APROVIZIONARE cd
where c.ID_FURNIZOR= cd.ID_FURNIZOR;

Exerciţiul 3:

a) Pe tabela T_FURNIZORI creaţi un index pe coloana id_furnizor (denumit


idx_id_furnizor) şi un index pe coloana nume_furnizor (denumit
idx_nume_furnizor);
create index idx_id_furnizor on T_FURNIZORI(id_furnizor);

b) Pe tabela T_COMENZI_APROVIZIONARE creaţi un index pe coloana id_furnizor


(denumit idx_id_furnizor_comenzi);
create index idx_id_furnizor_comenzi on T_COMENZI_APROVIZIONARE(id_furnizor);

c) Modificaţi planul de execuţie astfel încât să se utilizeze algoritmul SORT MERGE


JOIN;
select /*+ USE_MERGE (cd c)*/
c.ID_FURNIZOR, c.NUME_ FURNIZOR, cd.DATA, cd.CANTITATE_COMANDATA
from T_ FURNIZOR I c, T_comenzi_aprovizionare cd
where c.ID_ FURNIZOR =cd.ID_ FURNIZOR;

d) Eliminaţi condiţia de selecţie pe numele furnizorului. Observaţi planul de execuţie.


Comparaţi costul obţinut cu cel din cazul algoritmului Nested Loops.

select /*+ USE_NL (cd c)*/


c.ID_FURNIZOR, c.NUME_ FURNIZOR, cd.DATA, cd.CANTITATE_COMANDATA
from T_ FURNIZOR I c, T_comenzi_aprovizionare cd
where c.ID_ FURNIZOR =cd.ID_ FURNIZOR;
TEMA 2

Utilizaţi tabelele T_CLIENTI, T_FURNIZORI, T_PRODUSE, T_UNITATI,


T_COMENZI_DESFACERE, T_COMENZI_APROVIZIONARE din schema
MS_DBA/oracle. Puteti sa creati aceste tabele in schema proprie cu comanda:
CREATE TABLE nume_tabela AS SELECT * FROM ms_dba.nume_tabela;
CREATE TABLE T_CLIENTI AS SELECT * FROM ms_dba.T_CLIENTI;
CREATE TABLE T_FURNIZORI AS SELECT * FROM ms_dba.T_FURNIZORI;
CREATE TABLE T_PRODUSE AS SELECT * FROM ms_dba.T_PRODUSE;
CREATE TABLE T_UNITATI AS SELECT * FROM ms_dba.T_UNITATI;
CREATE TABLE T_COMENZI_DESFACERE AS SELECT * FROM
ms_dba.T_COMENZI_DESFACERE;
CREATE TABLE T_COMENZI_APROVIZIONARE AS SELECT * FROM
ms_dba.T_COMENZI_APROVIZIONARE;

1. Pe tabela T_FURNIZORI vizualizaţi indecșii creați. Creați indexul


idx_nume_furnizor pe coloana nume_furnizor (în cazul în care acest index nu
există);

CREATE INDEX T_FURNIZORI ON nume_furnizor(idx_nume_furnizor);

2. Creați o interogare prin care să afișați numele furnizorilor și data comenzilor de


aprovizionare pentru comenzile după 01 - 10 – 2006 (data > to_date('01-10-2006',
'dd-mm-yyyy'). Vizualizați planul de execuție.
select f.NUME_FURNIZOR , a.data
from T_FURNIZORI f , T_COMENZI_APROVIZIONARE a
where a.id_furnizor = f.id_furnizor
AND (DATA > to_date('01-10-2006', 'dd-mm-yyyy'));

3. Pe tabela T_COMENZI_APROVIZIONARE creați un index (idx_data) pe coloana


DATA.
CREATE INDEX T_COMENZI_APROVIZIONARE ON DATA(idx_data);

4. Rulați cererea de mai sus și observați planul de execuție. Dacă nu se modifică planul
de execuție, culegeți statistici pe tabela T_COMENZI_APROVIZIONARE și re-
verificați planul:
execute DBMS_STATS.GATHER_TABLE_STATS (user,
'T_COMENZI_APROVIZIONARE');

Begin

DBMS_STATS.GATHER_TABLE_STATS (user, 'T_COMENZI_APROVIZIONARE');

End;

5. Deoarece cardinalitatea este relativ mare, indexul nu este utilizat. Forțați utilizarea
acestuia prin directiva /*+ INDEX(b idx_data) */. Observați costul de execuție. Cum
explicați?
select /*+ INDEX(a idx_sal)*/ *from T_FURNIZORI f , T_COMENZI_APROVIZIONARE a
where a.id_furnizor = f.id_furnizor
AND (DATA > to_date('01-10-2006', 'dd-mm-yyyy'));

6. Modificați interogarea prin micșorarea intervalului de timp selectat la comenzile


încheiate între 1 oct si 4 oct 2006 (data between to_date('01-10-2006', 'dd-mm-yyyy')
and to_date('04-10-2006', 'dd-mm-yyyy')). Observați planul de execuție.
select /*+ INDEX(a idx_sal)*/ * from T_FURNIZORI f , T_COMENZI_APROVIZIONARE a
where a.id_furnizor = f.id_furnizor
AND (DATA > to_date('01-10-2006', 'dd-mm-yyyy'));

7. Modificați interogarea și selectați comenzile încheiate doar pe data de 4 oct. folosind


funcția EXTRACT (DAY FROM DATA) = 4. Observați planul de execuție. Cum
explicați?
select /*+ INDEX(a idx_sal)*/ * from T_FURNIZORI f , T_COMENZI_APROVIZIONARE a
where EXTRACT (DAY FROM DATA) = 4;
8. Rescrieți cererea de la punctul 6 pentru a afișa doar comenzile furnizorului 'KETIX
COMPROD SRL'. Care este modalitatea de execuție a planului?
select /*+ INDEX(a idx_sal)*/ * from T_FURNIZORI f , T_COMENZI_APROVIZIONARE a
where f.NUME_FURNIZOR = 'KETIX COMPROD SRL';

9. Forțați ne-utilizarea indexului pe tabela T_FURNIZORI prin utilizarea


directivei /*+ NO_INDEX(f)*/. Cum se modifica planul de execuție?
SELECT /*+ NO_INDEX(a idx_sal)*/ * from T_FURNIZORI f ,
T_COMENZI_APROVIZIONARE a
where a.id_furnizor = f.id_furnizor
AND (DATA > to_date('01-10-2006', 'dd-mm-yyyy'));

10. Inlocuiți condiția de egaliate cu f.NUME_FURNIZOR like 'K%'. Observați


diferențele.
SELECT /*+ NO_INDEX(a idx_sal)*/ * from T_FURNIZORI f ,
T_COMENZI_APROVIZIONARE a
where f.NUME_FURNIZOR like 'K%' ;

11. Modificați condiția de mai sus cu lower(f.NUME_FURNIZOR) = 'ketix comprod


srl' . Cum explicați?
SELECT /*+ NO_INDEX(a idx_sal)*/ * from T_FURNIZORI f ,
T_COMENZI_APROVIZIONARE a
where lower(f.NUME_FURNIZOR) = 'ketix comprod srl' ;

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