Cuprins
8. Vizualizri materializate
Numele
Dac vizualizarea materializat este bazat pe un tabel declarat prebuilt,
atunci numele acesteia trebuie s fie acelai cu numele tabelului.
Caracteristici de stocare
Dac vizualizarea nu este creat pe baza unui tabel prebuilt, atunci aceasta
va necesita spaiu de stocare n baza de date. Dac nu se cunoate ct spaiu de
stocare necesit vizualizarea, atunci se poate utiliza procedura ESTIMATE_SIZE
din pachetul DBMS_OLAP, care permite estimarea spaiului de stocare necesar.
Momentul actualizrii
Mod Descriere
ON Indic declanarea unei operaii de reactualizare ori de
COMMIT cte ori sistemul permanentizeaz o tranzacie care
opereaz asupra unui tabel de baz al vizualizrii
materializate. Aceasta ar putea determina creterea
timpului de execuie a operaiei COMMIT, ntruct
reactualizarea va face parte din acest proces.
ON Este implicit i indic efectuarea reactualizrii
DEMAND vizualizrii materializate la cererea utilizatorului, prin
intermediul procedurilor specifice din pachetul
DBMS_MVIEW (REFRESH, REFRESH_ALL_
MVIEWS, REFRESH_DEPENDENT).
Modaliti de actualizare
Opiuni Descriere
COMPLETE Implic reactualizarea complet, care se realizeaz prin
reexecutarea complet a cererii din definiia vizualizrii
materializate.
FAST Indic metoda de reactualizare incremental, care se
efectueaz corespunztor modificrilor survenite n
tabelele de baz. Modificrile sunt stocate ntr-un fiier
log (jurnal) asociat tabelului de baz.
FORCE Determin reactualizarea de tip FAST, dac este posibil,
n caz contrar actualizarea de tip COMPLETE.
NEVER Indic faptul c vizualizarea nu va fi reactualizat.
Rescrierea cererilor
nainte de a defini o vizualizare se pot afla, utiliznd procedura
DBMS_MVIEW.EXPLAIN_MVIEW, ce tipuri de rescriere a cererilor va permite
aceasta. Dup ce vizualizarea a fost creat se poate afla, cu ajutorul procedurii
DBMS_MVIEW.EXPLAIN_REWRITE, de ce aceasta va rescrie o cerere sau nu.
O vizualizare materializat poate fi utilizat pentru rescrierea cererilor
dac n definiia sa este specificat clauza ENABLE QUERY REWRITE.
Clauza ORDER BY
Clauza ORDER BY a comenzii SELECT care definete vizualizarea este
utilizat doar la momentul crerii acesteia. Nu va fi utilizat n timpul operaiilor
de actualizare a vizualizrii. Pentru a mbunti performana cererilor care se
execut la vizualizri cu multe date, se recomand stocarea liniilor n
vizualizare, n ordinea dat de clauza ORDER BY. Aceast clauz nu este
considerat parte din definiia vizualizrii.
Logurile (jurnalul) vizualizrilor materializate
Pentru a putea realiza actualizri de tip FAST sunt necesare fiiere de tip log
definite pentru tabele de baz. Acestea se creeaz prin comanda:
n fiierul log se pot nregistra valori ale coloanelor care nu sunt chei
primare: coloane utilizate n filtre sau coloane de join.
Clauza NEW VALUES determin dac sunt salvate n fiierele log att
valorile vechi, ct i valorile noi ale operaiilor UPDATE.
n plus de rowid-uri, pentru vizualizrile materializate care conin
agregate, trebuie incluse i clauzele INCLUDING NEW VALUES i
SEQUENCE. Se recomand utilizarea opiunii SEQUENCE cu excepia
cazurilor n care exist sigurana c niciodat nu se vor folosi combinaii de
operaii LMD pe mai multe tabele.
Jurnalul este:
necesar pentru a realiza mai rapid operaiile de refresh;
creat implicit cu opiunea WITH PRIMARY KEY, dac este omis una
dintre clauzele PRIMARY KEY, ROWID, OBJECT ID;
localizat n aceeai schem ca i tabelul de baz;
populat cu ajutorul unui declanator creat asupra tabelului de baz;
creat asupra tabelului de baz (pentru un tabel se poate defini un singur
jurnal);
denumit implicit de sistem: MLOG$_nume_tabel.
Exemple
a. Implicit, fiierul log menine valorile cheii primare.
CREATE MATERIALIZED VIEW LOG ON produse;
9. Rescrierea cererilor
v.client_id AS client,
SUM(cantitate * pret_unitar_vanzare) AS valoare
FROM vanzari v, dim_produse p, dim_timp t
WHERE t.id_timp = v.timp_id
AND v.produs_id = p.id_produs
GROUP BY p.denumire, t.luna, v.client_id;
Exemplu:
Statistici pentru un obiect (de exemplu, pentru vizualizarea materializat
vm_produs_trimestru):
Copyright 2007-2015 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.
Baze de Date Depozit 52
EXECUTE DBMS_STATS.GATHER_TABLE_STATS
('USER_DW','VM_PRODUS_TRIMESTRU',
estimate_percent=>20,block_sample=>TRUE,
cascade=>TRUE);
Pentru toate obiectele noi create, la nivel de schem:
EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS
('USER_DW', options => 'GATHER EMPTY',
estimate_percent=>20, block_sample=>TRUE,
cascade=>TRUE);
Parametrul QUERY_REWRITE_INTEGRITY
Acest parametru determin gradul de integritate pentru care sistemul
Oracle aplic rescrierea cererilor. Implicit acesta are valoarea ENFORCED.
Parametrul OPTIMIZER_MODE
Acest parametru stabilete modul implicit pentru alegerea unei abordri de
optimizare. Valoarea implicit a parametrului este choose.
OPTIMIZER_MODE =
{first_rows_[1 | 10 | 100 | 1000]
| first_rows | all_rows | choose | rule}
Exemplu:
SELECT p.categorie_4 AS domeniu, t.luna AS luna,
r.oras AS oras,
SUM(cantitate * pret_unitar_vanzare) AS valoare,
COUNT(cantitate* pret_unitar_vanzare) AS numar
FROM vanzari v, dim_produse p,
dim_timp t, dim_regiuni r
WHERE t.id_timp = v.timp_id
AND v.produd_id = p.id_produs
AND v.regiune_id = r.id_regiune
GROUP BY p.categorie_4, t.luna, r.oras;
Stare Constrngere /
RELY NORELY
Mod integritate rescriere
ENFORCED Nu Nu
TRUSTED Da Nu
STALE_TOLERATED Da Nu
SELECT zi_in_an,
SUM(valoare_sold) AS sum_valoare_sold
FROM timp_view, vanzari
WHERE timp_id = id_timp
GROUP BY zi_n_an;
SELECT p_categorie,
SUM(valoare_sold) AS sum_valoare_sold
FROM vanzari, produse
WHERE prod_id = id_prod
GROUP BY p_categorie;
Potrivirea expresiei
O expresie ce apare n cerere poate fi nlocuit cu o coloan simpl din
vizualizarea materializat, care reprezint acea expresie precalculat. Dac
cererea poate fi rescris cu expresia precalculat, atunci cererea se va executa
mai rapid.
Exemplu:
Se consider vizualizarea materializat vm2_sum_prod_luna_client i
urmtoarea cerere SQL:
Exemplu:
Se consider urmtoarea vizualizare materializat:
CREATE MATERIALIZED VIEW vm_categorii_lunare
ENABLE QUERY REWRITE
AS
SELECT categorie_5 AS categorie,
TO_CHAR(timp_id,'YYYY-MM') AS luna,
SUM(cantitate* pret_unitar_vanzare) AS valoare
FROM vanzari v, dim_produse p
WHERE v.produs_id = p.id_produs
GROUP BY categorie_5, TO_CHAR(timp_id,'YYYY-MM');
Se consider cererea care listeaz valoarea vnzrilor pe categorii de
produse pentru anul 2007.
SELECT categorie_5 AS categorie,
SUM(cantitate* pret_unitar_vanzare)
FROM vanzari v, dim_produse p
WHERE v.produs_id = p.id_produs
AND TO_CHAR(v.timp_id, 'YYYY-MM') BETWEEN '2007-01'
AND '2007-12'
GROUP BY p_categorie;
Cererea va fi rescris astfel:
SELECT categorie, valoare
FROM vm_vanzari_lunare
WHERE luna BETWEEN '2007-01' AND '2007-12';
Compatibilitatea seleciei
Sistemul Oracle permite rescrierea cererilor astfel nct s foloseasc
vizualizri materializate n care clauza HAVING sau WHERE conine o selecie
a unei submulimi de date dintr-un tabel.
Compatibilitatea seleciei poate fi:
simpl selecii de genul <expresie> operator_relational <constanta>;
complex selecii de genul <expresie> operator_relational <expresie>;
de tip range selecii de genul <expresie> BETWEEN <const1> AND
<const2>;
de tip in list selecii de genul lista_coloane IN lista_valori; de remarcat
este faptul c seleciile de forma coloana1='v1' OR coloana1='v2' OR
coloana1='v3' OR .... sunt tot de tipul list;
de tip IS [NOT] NULL;
de tip [NOT] LIKE.
Exemplul 1:
n cerere:
WHERE prod_id = 102
n vizualizare:
WHERE prod_id BETWEEN 0 AND 200
Exemplul 2:
n cerere:
WHERE prod_id > 10 AND prod_id < 50
n vizualizare:
WHERE prod_id BETWEEN 0 AND 200
Exemplul 3:
n cerere:
WHERE vanzari.valoare_sold * .07 BETWEEN
1 AND 100
n vizualizare:
WHERE vanzari.valoare_sold *. 07 BETWEEN
0 AND 200
Exemplul 4:
n cerere:
WHERE cost.unit_pret * 0.95 >
cost_unit_cost * 1.25
n vizualizare:
WHERE cost.unit_pret * 0.95 >
cost_unit_cost * 1.25
Exemplul 5:
Seleciile din cerere nu sunt constrnse de nici o selecie din vizualizare,
dar valorile din dreapta trebuie coninute de vizualizare. Cererea urmtoare va fi
rescris.
n cerere:
WHERE p_nume = 'pantaloni'
AND p_categorie = 'barbati'
n vizualizare:
WHERE p_categorie = 'barbati'
Exemplul 6:
Vizualizarea este mai restrictiv dect cererea. Cererea urmtoare nu va fi
rescris.
n cerere:
WHERE p_categorie = 'barbati'
n vizualizare:
WHERE p_nume = 'pantaloni'
AND p_categorie = 'barbati'
Exemplul 7:
n cerere:
WHERE prod_id, client_id IN
((1022, 1000), (1033, 2000))
n vizualizare:
WHERE prod_id IN (1022,1033)
AND client_id IN (1000, 2000)
Exemplul 8:
n cerere:
WHERE prod_id = 1022
AND client_id IN (1000, 2000)
n vizualizare:
WHERE (prod_id, client_id) IN
(1022, 1000), (1022, 2000))
Exemplul 9:
Rescrierea eueaz.
n cerere:
WHERE prod_id = 1022
AND client_id IN (1000, 2000)
n vizualizare:
WHERE (prod_id, client_id, c_oras)
IN ((1022, 1000, 'Bucuresti'),
(1022, 2000, 'Iasi'))
Exemplul 10:
Cererea va fi rescris:
n cerere:
WHERE populatie_oras > 15000
AND populatie_oras < 25000
AND judet= 'Vrancea'
n vizualizare:
WHERE (populatie_oras < 5000
AND judet = 'Bucuresti')
OR (populatie_oras BETWEEN 10000 AND
50000
AND judet = ' Vrancea ')
Exemplul 11:
CREATE MATERIALIZED VIEW cal_luna_vanzari_id_mv
BUILD IMMEDIATE
REFRESH FORCE
ENABLE QUERY REWRITE
AS
SELECT calendar_luna_desc,
SUM(valoare_sold) AS suma
FROM vanzari,timp
WHERE timp_id = id_timp AND id_client = 10
GROUP BY calendar_luna_desc;
SELECT calendar_luna_desc,
SUM(valoare_sold) AS suma
FROM vanzari,timp
WHERE timp_id = id_timp AND id_client = 10
GROUP BY calendar_luna_desc;
Exemplul 12:
CREATE MATERIALIZED VIEW produs_vanzari_mv
BUILD IMMEDIATE
REFRESH FORCE
ENABLE QUERY REWRITE
AS
SELECT p_nume,
SUM(valoare_sold) AS suma
FROM produse, vanzari
WHERE prod_id = id_prod
GROUP BY p_nume
HAVING SUM(valoare_sold) BETWEEN 5000 AND
50000;
Se d urmtoarea cerere:
Exemplul 13:
Copyright 2007-2015 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.
Baze de Date Depozit 64
Se d urmtoarea cerere:
Exemplul 14:
CREATE MATERIALIZED VIEW promo_vanzari_mv
BUILD IMMEDIATE
REFRESH FORCE
ENABLE QUERY REWRITE
AS
SELECT promo_nume,
SUM(valoare_sold) AS sum_valoare_sold
FROM promotii, vanzari
WHERE promo_id = id_promo
AND promo_nume IN
('cupon', 'premium', 'fluturas')
GROUP BY promo_name;
Se d urmtoarea cerere:
GROUP BY promo_name;
SELECT *
FROM promo_vanzari_mv
WHERE promo_nume IN ('coupon', 'premium');
SELECT *
FROM promo_vanzari_mv
WHERE promo_nume = 'cupon'
AND sum_valoare_sold > 1000;
Compatibilitatea join-ului
Join-urile din cerere sunt comparate cu join-urile din definiia vizualizrii
materializate. n general, aceast comparare poate fi clasificat n trei categorii:
1. join-uri comune, care apar att n cerere ct i n vizualizare;
2. join-uri delta, care apar n cerere, dar nu i n vizualizare (cereri delta
join);
3. join-uri delta, care apar n vizualizare, dar nu i n cerere (vizualizri
delta join).
Join-uri comune
Exemplul 1:
SELECT p_nume, zi_sf_saptamana, SUM(valoare_sold)
FROM vanzari, produse, timp
WHERE timp_id=id-timp AND prod_id = id_prod
AND zi_sf_saptamana BETWEEN
TO_DATE('01-AUG-1999', 'DD-MON-YYYY')
AND TO_DATE('10-AUG-1999', 'DD-MON-YYYY')
GROUP BY p_nume, zi_sf_saptamana;
Exemplul 2:
SELECT DISTINCT p_nume
FROM produse p
WHERE EXISTS
(SELECT *
FROM vanzari s
WHERE p.prod_id=s.id_prod
AND s.valoare_sold > 1000);
s.id_prod = p.prod_id.
SELECT p_nume
Copyright 2007-2015 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.
Baze de Date Depozit 67
SELECT p_nume
FROM (SELECT DISTINCT p_nume
FROM join_vanzari_timp_produs_oj_mv
WHERE valoare_sold > 1000
AND prod_id IS NOT NULL);
Exemplul 3:
SELECT p_nume, zi_sf_saptamana, c_oras,
SUM(valoare_sold)
FROM vanzari,clienti,timp,produse
WHERE timp_id=id_timp
AND prod_id=id_prod
AND client_id = id_client
GROUP BY p_nume, zi_sf_saptamana, c_oras;
Exemplul 4:
SELECT zi_sf_saptamana, SUM(valoare_sold)
FROM vanzari,timp
Copyright 2007-2015 Lect. Dr. Gabriela Mihai. Toate drepturile rezervate.
Baze de Date Depozit 68
Suficiena datelor
n cazul acestei verificri, optimizorul determin dac toate coloanele de
date necesare cererii pot fi obinute din vizualizarea materializat. Pentru aceasta
se utilizeaz echivalena coloanelor.
De exemplu, dac avem un inner join ntre tabelele A i B cu predicatul de
join A.X = B.X, atunci datele din coloana A.X vor fi egale cu datele din coloana
B.X n rezultatul join-ului. Aceast proprietate a datelor este utilizat pentru a
verifica potrivirea coloanei A.X din cerere cu coloana B.X din vizualizare.
Exemplul 1:
SELECT p_nume, timp.timp_id, zi_sf_saptamana,
SUM(valoare_sold)
FROM vanzari, produse, timp
WHERE timp_id=id_timp AND prod_id = id_prod
GROUP BY p_nume, timp_id, zi_sf_saptamana;
Exemplul 2:
SELECT p_categorie, zi_sf_saptamana,
SUM(valoare_sold)
FROM vanzari, produse, timp
WHERE timp_id=id_timp AND prod_id = id_prod
AND p_categorie='barbati'
GROUP BY p_categorie, zi_sf_saptamana;
Exemplul 3:
CREATE DIMENSION produse_dim
LEVEL produs IS (produse.prod_id)
LEVEL subcategorie IS (produse.p_subcategorie)
LEVEL categorie IS (produse.p_categorie)
HIERARCHY prod_rollup (
produs CHILD OF
subcategorie CHILD OF
categorie)
ATTRIBUTE produs DETERMINES produse.prod_nume
ATTRIBUTE produs DETERMINES produse.prod_desc
ATTRIBUTE subcategorie
DETERMINES produse.p_subcateg_desc
ATTRIBUTE categorie
DETERMINES produse.p_categ_desc;
Se d cererea urmtoare:
Compararea gruprilor
Aceast verificare este necesar dac att cererea ct i vizualizarea conin
clauza GROUP BY. Iniial optimizorul determin dac gruparea datelor cerute
de cerere este identic cu cea folosit n vizualizare. De exemplu, o cerere
folosete o grupare dup p_subcategorie i o vizualizare materializat stocheaz
datele grupate dup p_subcateg i p_subcateg_desc. Gruparea este aceeai n
ambele cazuri determinnd gruparea dup atributul p_subcategorie care
determin funcional atributul p_subcateg_desc.
Vizualizarea sum_vanzari_pcat_sapt_mv grupeaz datele dup zi_sf_sapt
i p_subcategorie. Urmatoarea cerere grupeaz datele dup p_subcategorie.
Exemplul 1:
SELECT p_subcategorie,
SUM(valoare_sold) AS sum_valoare
FROM vanzari, produse
WHERE prod_id=id_prod
GROUP BY p.p_subcategorie;
Exemplul 2:
SELECT p_categorie, zi_sf_saptamana,
SUM(valoare_sold) AS sum_valoare
FROM vanzari,produse,timp
WHERE timp_id=id_timp AND prod_id=id_prod
GROUP BY p_categorie,zi_sf_saptamana;
Compararea agregatelor
Aceast verificare este necesar doar dac att cererea, ct i vizualizarea
conin agregate. De exemplu, dac cererea returneaz AVG(X), iar vizualizarea
conine SUM(X) i COUNT(X), atunci cererea poate fi rescris cu
SUM(X)/COUNT(X).
Dac verificarea compatibilitii gruprilor determin c vizualizarea
stocheaz agregate de tip rollup, atunci se ncerc determinarea fiecrui agregat
cerut de cerere prin utilizarea agregatelor de nivele inferioare ale vizualizrii
materializate. De exemplu, SUM(vanzari) la nivel de jude se poate obine prin
nsumarea valorilor SUM(vanzari) la nivel de ora care au aceeai valoare pentru
jude.
Exemplu:
SELECT mv.p_subcategorie,
SUM(mv.sum_valoare_sold)/SUM(mv.count_valoare_sold)
AS avg_vanzari
FROM sum_vanzari_pcat_luna_oras_mv mv
GROUP BY mv.p_subcategorie;