Upload
vokhue
View
233
Download
5
Embed Size (px)
Citation preview
RĪGAS TEHNISKĀ UNIVERSITĀTEDatorzinātnes un informācijas tehnoloģijas fakultāte
Informācijas tehnoloģijas institūts
3. praktiskais darbs priekšmetā
„Progresīvās datu bāzes”
“DATU NOLIKTAVAS IZVEIDOŠANA UN IZMANTOŠANA”
Izstrādāja: Maksims Korņevs
II RDMI-2, 081RDB076
Pārbaudīja: asoc. prof. J. Eiduks
2012./13. māc. gads
1
ANOTĀCIJA
Darba mērķis tiek definēts kā izpētīt datu noliktavas tehnoloģija. Mērķa
sasniegšanai tika izdomāta uzskaitīšanas sistēma biroja preču veikalam SIA
VEIKALS, kas satur informāciju par precēm, klientiem, darbiniekiem un to
mijiedarbības vēsturi jeb transakcijām. Tika izdomātas datu bāzes tabulas un objekti,
kā arī loģiskas saites starp tām. Kā rezultāts, darbā ir aprakstīta darbība ar datu
noliktavas tehnoloģijām, kas ietver sevī vairākus posmus tādus kā faktu tabulas,
dimensiju tabulu, materializētu skatu utt izmantošana. Ir definēti un izpildīti vairāki
vaicājumi.
Darbā gaitā tika izmantota SQL valoda. Darbs tika veikts ar Oracle SQL
Developer 3.0.04 programmas palīdzību.
Darba apjoms ir 40 lappuses, kuras satur 25 attēlus un 6 tabulas.
2
SATURS
Anotācija............................................................................................................2
Saturs..................................................................................................................3
Uzdevums...........................................................................................................4
1. Izmantotā datu bāze........................................................................................5
2. Oracle SQL Developer programmas izmantošana.........................................6
3. Dimensiju modelēšana...................................................................................8
4. Datu glabāšanas struktūras...........................................................................11
4.1. Dimensiju tabulas..................................................................................11
4.2. Faktu tabula...........................................................................................15
4.3. Datu ievade............................................................................................15
5. Grupēšanas vaicājumi..................................................................................18
5.1. GROUP BY vaicājumi..........................................................................19
5.2. ROLLUP vaicājumi............................................................................20
5.3. CUBE vaicājumi...................................................................................21
5.4. GROUPING vaicājumi.........................................................................22
5.5. GROUPING_ID vaicājumi...................................................................25
6. SQL Model vaicājumi..................................................................................26
7. PIVOT vaicājumi.........................................................................................29
8. Materializētie skati.......................................................................................33
9. Secinājumi....................................................................................................38
10. Izmantotās literatūras saraksts....................................................................40
3
UZDEVUMS
1. Dimensiju modelēšana: tiek izveidotas vismaz trīs dimensijas ar hierarhijām
(hierarhijā vismaz trīs līmeņi) un definēti vismaz divi faktu veidi.
2. Datu bāzē tiek izveidotas atbilstošās datu glabāšanas struktūras: dimensiju
tabulas un faktu tabula. Tiek veikta datu ievade.
3. Izmantojot GROUP by CUBE() konstrukciju un funkciju GROUPING(),
tiek veikti vaicājumi, lai demonstrētu to iespējas.
4. Izmantojot SQL Model konstrukciju, tiek veikti vaicājumi, lai demonstrētu
tās iespējas.
5. Izmantojot Pivot konstrukciju, tiek veikti vaicājumi, lai demonstrētu tās
iespējas.
5. Papildus dimensiju un faktu tabulām tiek izveidoti materializētie skati,
kuros iekļauti vaicājumos pieprasītie datu agregāti.. Tiek veikti vaicājumi un tiek
pārbaudīts vai notiek vaicājumu pārrakstīšana (rewriting) sakarā ar materializēto skatu
izmantošanu.
6. Kopējie secinājumi.
4
1. IZMANTOTĀ DATU BĀZE
Datu bāze ir paredzēta biroja preču veikalam SIA VEIKALS. Tā ir
uzskaitīšanas sistēma, kas satur informāciju par precēm, klientiem, darbiniekiem un to
mijiedarbības vēsturi jeb transakcijām.
Saskaņā ar aprakstu vislabākais risinājums ir datu bāze, kas ir redzama 1.
attēlā.
Attēls 1. Datu bāze
5
2. ORACLE SQL DEVELOPER PROGRAMMAS IZMANTOŠANA
Darba izpildei tika izmantots ORACLE programma – ORACLE SQL
Developer 3.0.04. ORACLE SQL Developer ir SQL*Plus grafiskā versija, kas dot
iespēju datu bāzes administratoriem ērtā veidā izpildīt pamatuzdevumus: apskatīt,
veidot, rediģēt un iznicināt datu bāzes objektus; pildīt SQL komandas un skriptus,
rediģēt un atkļūdot PL/SQL kodus; ievadīt un eksportēt datus; apskatīt un veidot
atskaites.
Programmas palaišanas fails ir sqldeveloper.exe (sk. att. 2)
Attēls 2. ORACLE SQL Developer palaišanas logs
Pirmais solis, kas ir nepieciešams izveidot ir savienojuma ar datu bāzi
izveidošana. To var izdarīt sekojoši:
1) no izvēlnes VIEW ir nepieciešams izvelēties rīkjoslu Connections;
2) rīkjoslā Conections izvēlēties New Connection (sk. attēls 3);
3) attiecīgos laukos ir jāievada savienojuma parametri un lietotāja konta
dati;
4) uzklikšķinot uz Test Connection, jāparādās ziņojumam Status:
Success;
5) jāsaglabā savienojums.
6
Attēls 3. New Coonection parametru logs
Kad savienojums ir izveidots ir jāpieslēdzas datu bāzei, uzklikšķinot ar labu
taustiņu uz jaunizveidotā savienojuma nosaukuma un izvēloties Connect. Vaicājumi
jāraksta jaunatvērtajā logā. Palaist izpildei uzrakstītu vaicājumu var ar pogu F5.
Rezultāti tiek izvadīti logā Script Output kā ir redzams attēlā 4.
Attēls 4. ORACLE SQL Developer darba virsma
7
3. DIMENSIJU MODELĒŠANA
Dimensiju modelēšana ir metode, kas tiek lietota projektējot datu noliktavas
datu struktūras. Šī tehnoloģija nodrošina datu struktūras vieglu uztveramību un
izprotamību. Veidojot operatīvās datu bāzes, datu struktūras projektēšanai izmanto
ER diagrammas.
Attēls 5. Dimensiju modelis
Dimensiju modelēšana ir loģikas projektēšanas tehnika, kas mēģina prezentēt
datus intuitīvi labi izprotamā veidā un nodrošina ātru piekļūšanu vajadzīgajiem
datiem. Tiek izmantotas faktu un dimensiju tabulas. Faktu tabulai ir vairākas datu
meklēšanas atslēgas. Dimensiju tabulas primārā atslēga atbilst vienai faktu tabulas
atslēgai. Dimensiju tabulas ir ieejas punkti datu noliktavā.
Dimensiju modeļa priekšrocības:
1. Dimensiju modelis ir labi izprotams un no tā vienkārši var iegūt
nepieciešamos datus.
2. Visas dimensijas ir loģiski ekvivalentas. Līdz ar to vaicājumi ir
simetriski, vienveidīgi.
3. Dimensiju modelis ir viegli paplašināms, pievienojot :
a. jaunus faktus;
b. jaunas dimensijas;
c. jaunus dimensiju atribūtus;
d. jaunu apakšdimensiju ieviešana.
8
Faktu tabula
1. dimensiju
tabula
2. dimensiju
tabula
3. dimensiju
tabula
4. Ir speciālas pieejas īpašu situāciju modelēšanā:
a. lēnu izmaiņu dimensiju modelēšana;
b. heterogēnu biznesa objektu izvērtēšana (vienlaicīgi jāievēro
aršķirīgas biznesa lietas);
c. “pay-in advance” datubāzes, kurās var apskatīt transakcijas un
kopējo gala rezultātu ;
d. “event-handling” datubāzes - darbība faktu deficītā.
5. Agregātu lietošanas iespējas (būtiskas vaicājuma izpildes ātrdarbības
palielināšanas iespējas).
Dimensiju modelī svarīgi ir atšķirt faktus un atribūtus.
Fakts ir kaut kādi dati, kas iepriekš nav zināmi. Tie parasti ir skaitļu formā
(reāli skaitļi), bet var būt arī teksta veidā (retāk). Atribūts parasti ir teksta formā un
norāda reālu lietu īpašību.
Tekstuālie atribūti, kas raksturo lietas tiek organizēti dimensijās. Dimensijas
atribūti ir cieši saistīti viens ar otru. Dimensiju vērtībām kombinējoties kopā, rodas
norāde uz faktiem. Ja dimensijas ir samērā vāji korelētas, tad fakta iespējamo vērtību
skaits ir neliels. Ja korelācijas pakāpe ir augsta, fakta vērtību skaits var būt ļoti liels.
Atribūtiem dimensiju modelī ir izšķiroša loma. Tie veido lietojuma vaicājuma
noteikumu sistēmu (ierobežojumus) un igūstamā pārskata rindu virsrakstus.
Dimensiju tabulā atribūti parasti veido vairākas hierarhiju sistēmas. Labi
projektētā datu noliktavā pieprasot vienādu skaitu rakstu dažādās hierarhijas pakāpēs,
izpildes laiki nedrīkst būtiski atšķirties.
Strādājot ar dimensiju tabulām jānodrošina labas to atribūtu vērtību pārskata
iespējas. Lietotājam bieži ir vēlams noskaidrot kādas un cik ir unikālas atribūtu
vērtības un kā tās ir saistītas ar citu atribūtu vērtībām. Tā kā katrs lietotājs datus
analizē izejot no savām prasībām, lietderīgi izmantot ierobežojumu definēšanu un
piekārtošanu katram lietotāja mehānismam. Lietotājs definē savus ierobežojumus, tie
fiksējas un nākošā sesijā atkal tiek ievēroti.
Dažreiz zvaigznes shēma tiek paplašināta uz sniegpārsliņas shēmu izslēdzot
no sākotnējās dimensiju tabulas zemas kardinalitātes atribūtus un izveidojot
pakārtotas dimensijas tabulu.
Datu noliktavas kvalitāti nosaka dimensiju atribūtu kvalitāte. Dimensiju
atribūtiem un to vērtībām jābūt:
9
saprotamiem;
aprakstošiem;
pilnīgiem, bez kļudainām (pretrunīgām) vērtībām;
indeksētiem;
dokumentētiem (metadatos).
Darbā ir izmantota sniegpārsla modeļa shēma (sk. 6. att.) biroja preču
veikalam, kur ir trīs dimensijas: Darbinieku_dim (satur informāciju par veikala
darbiniekiem), Klientu_dim (satur informāciju par klientiem) un Precu_dim (satur
informāciju par precēm). Katrā no šīm dimensijām ir hierarhiskie līmeni. Visas
dimensijas apvieno faktu tabula Faktu_taula, kur ir ierakstīta informācija par
transakcijas datiem: klients, prece un to daudzums, atbildīgais darbinieks, datums un
transakcijas statuss.
Attēls 6. Darba izmantota sniegpārsla modeļa shēma
10
4. DATU GLABĀŠANAS STRUKTŪRAS
Lai datu bāze varētu pareizi funkcionēt ir nepieciešams izveidot atbilstošās
datu glabāšanas struktūras: dimensiju tabulas un faktu tabula.
Tabulas ir pamatstruktūra, kurā dati tiek glabāti datu bāzē. Tabulas ir sadalītas
rindās un kolonnās. Katra rinda ir viena datu vienība, un katrs lauks var būt uzskatams
par šādu datu kopas noteiktu daļu. Tabulas izveidošanas laikā, nosaka lauku
apzīmējumus un datu tipus, kas tur glabājas.
Tabulas izveidošana tika realizēta SQL valodā ar komandas CREATE TABLE
palīdzību, un tās pamata sintakse ir:
CREATE TABLE tabulas_nosaukums(pirmā_lauka_nosaukums pirmā_lauka_tips,otrā_lauka_nosaukums otrā_lauka_tips,...pēdējā_lauka_nosaukums pēdējā_lauka_tips);
Eksistē vairākas lauka tipi, kas ir domāti datu glabāšanai kā skaitli binārā
sistēmā (binary, varbinary, image) un decimālā sistēmā (bigint, numeric, bit, smallint,
decimal, smallmoney, int, tinyint, float, real), datu glabāšanai kā laiks vai datums
(date, datetimeoffset, datetime2, smalldatetime, datetime, time), kā teksta virkne
(char, varchar, text) vai citā veidā (cursor, timestamp, hierarchyid, uniqueidentifier,
sql_variant, xml utt.)
4.1. Dimensiju tabulas
Datu bāzē ir piecas dimensiju tabulas: Cilveku_dim, Darbinieku_dim,
Adresu_dim, Klientu_dim un Precu_dim. Katrai tabulai ir savi atribūti un līdz ar to,
katra tabula ir definēta atsevišķi sekojošā veidā:
CREATE TABLE Cilveku_dim (Cilveka_Id Number NOT NULL,Vards VarChar2(15),Uzvards VarChar2(15),Per_kods VarChar2(12),CONSTRAINT Cilveks_PK PRIMARY KEY (Cilveka_Id));
11
Attēls 7. Cilvēku dimensijas izveidošana
CREATE TABLE Darbinieku_dim (Darbinieka_Id Number NOT NULL,Amats VarChar2(10),Alga Number(10,2),Nodala VarChar2(12),Cilveks_FK Number,CONSTRAINT Darbinieks_PK PRIMARY KEY (Darbinieka_Id),CONSTRAINT Cilveks_FKey FOREIGN KEY (Cilveks_FK) REFERENCES Cilveku_dim(Cilveka_Id));
Attēls 8. Darbinieku dimensijas izveidošana
CREATE TABLE Adresu_dim (Adreses_Id Number NOT NULL,Valsts VarChar2(10),Pilseta VarChar2(10),
12
Iela VarChar2(10),Maja Number,Birojs Number,Pasta_indekss VarChar2(7),CONSTRAINT Adrese_PK PRIMARY KEY (Adreses_Id));
Attēls 9. Adrešu dimensijas izveidošana
CREATE TABLE Klientu_dim (Klienta_Id Number NOT NULL,Konts VarChar2(30),Atlaide Number,Talrunis VarChar2(12),Adrese_FK Number,CONSTRAINT Klients_PK PRIMARY KEY (Klienta_Id),CONSTRAINT Adrese_FKey FOREIGN KEY (Adrese_FK) REFERENCES Adresu_dim(Adreses_Id));
13
Attēls 10. Klientu dimensijas izveidošana
CREATE TABLE Precu_dim (Preces_Id Number NOT NULL,Nosaukums VarChar2(15),Cena VarChar2(15),Mervieniba VarChar2(12),Piegadatajs VarChar2(12),CONSTRAINT Prece_PK PRIMARY KEY (Preces_Id));
Attēls 11. Preču dimensijas izveidošana
Šādā veidā visas dimensijas ir izveidotas.
14
4.2. Faktu tabula
Pēc dimensiju tabulu izveidošanas faktu tabula ir izveidota. Tas ir izpildīts ar
sekojošo vaicājumu:
CREATE TABLE Faktu_Tabula (Klients Number,Prece Number,Daudzums Number,Darbinieks Number,Datums Date,Statuss Number,CONSTRAINT Klients_FKey FOREIGN KEY (Klients) REFERENCES Klientu_dim(Klienta_Id),CONSTRAINT Prece_FKey FOREIGN KEY (Prece) REFERENCES Precu_dim(Preces_Id),CONSTRAINT Darbinieks_FKey FOREIGN KEY (Darbinieks) REFERENCES Darbinieku_dim(Darbinieka_Id));
Attēls 12. Faktu tabulas izveidošana
4.3. Datu ievade
Kad visas tabulas un saites starp tām ir izveidotas, ir nepieciešams ievadīt
datus.
Datu ievadīšana var notiek ar komandu INSERT INTO vai ar SQL*LOADER
programmas palīdzību. Tā kā ir paredzēts liels datu apjoms, SQL*LOADER ir
izmatots.
SQL*LOADER ir ievades programma, kas domāta ārējas datu ievadei iekš
Oracle datu bāzes. Programma dot iespēju ievadīt dažādu failu formātus, veikt daļēju
15
ievadi un arī ievadīt datus vairākām tabulām. Programmas palaišana sakas ar
operācijas sistēmas komandu:
SQLLDR lietotājs/parole@// 85.254.218.238:1521/
rtuditf CONTROL=Loader.ctl,
kur lietotājs un parole ir attiecīgi dati serverī. Loader.ctl ir kontroles fails, kas
satur nepieciešamu informāciju:
LOAD DATAINFILE 'C:\SCHOOL\DB3\Cilveki.dat'INTO TABLE Cilveku_dimFIELDS TERMINATED BY ","(Cilveka_ID, Vards, Uzvards, Per_kods)
Fails ar datiem Cilveki.dat izskatās sekojoši:
1, Anete, Blauva, 040768-14856
2, Staņislavs, Duškins, 131071-17321
3, Savelijs, Guževs, 010760-13602
4, Maksims, Ivanovs, 220873-17412
5, Oļegs, Mihailovs, 110866-12099
6, Ernests, Pakers, 291192-10443
7, Aleksandrs, Petrišins, 010481-18997
8, Uģis, Pūpoliņš, 030164-18812
9, Aleksandrs, Sila, 091095-17831
10, Aleksandrs, Suvorovs, 221063-13057
…
108, Viktors, Pehota, 190374-18211
16
Līdzīgā veidā tika aizpildītas visas tabulas.
Pārliecināties, kā ievadīti dati ir ievadīti korekti cara ar SELECT vaicājumu:
Attēls 13. Dati no Faktu tabulas
17
5. GRUPĒŠANAS VAICĀJUMI
Grupēšana ļauj analizēt datus, lai izdotu nepieciešamo rezultātu. Ir vairāki
grupēšanas funkcijas:
Group by
Rollup (GROUP BY ROLLUP)
Cube (GROUP BY CUBE)
Grouping
Grouping_ID un citi
Darba tiek grupēti dati par ierakstītām transakcijām pēc darbinieka un pēc
klienta pilsētas.
Dati vaicājumam var būt iegūti ar sekojošo vaicājumu:
SELECT C.Uzvards, F.Klients, A.Pilseta, (F.Daudzums*P.Cena*(100-K.Atlaide)/100) AS SummaFROM Faktu_Tabula F, Precu_Dim P, Klientu_Dim K, Darbinieku_Dim D, Cilveku_Dim C, Adresu_Dim AWHERE F.Prece=P.Preces_Id AND F.Klients=K.Klienta_Id AND F.Darbinieks=D.Darbinieka_Id AND D.Cilveks_Fk = C.Cilveka_Id AND K.Adrese_FK=A.Adreses_ID;
Lai nerakstītu kodu katru reizi, ir izveidots skats „Skats”, kas izvada
nepieciešamu informāciju.
18
Attēls 14. Skats grupēšanas vaicājumiem
5.1. GROUP BY vaicājumi
GROUP BY darbojas ar agregātām funkcijām, piemērām funkcija SUM,
COUNT, MAX, MIN un citām. Agregātas funkcijas izanalizē vairākas rindas un izdot
vienu rezultātu, piemēram:
Attēls 15. Visu transakciju kopīga summa
19
Iekļaujot GROUP BY vaicājumā, tas ierobežo apstrādāto datu kopu. Tādā
veidā ir saņemtas agregātas vērtības katrai atsevišķai kombinācijai, kas ir definētas
GROUP BY daļā. Sagaidāmo ierakstu skaitu var aprēķināt, reizinot atšķirīgas vērtības
katrā kolonnā, kas ir uzskaitītas pēc GROUP BY. Darba gadījumā kolonai „Uzvards”
ir 26 vērtības, kolonai „Klients” arī 26 vērtības, un kolonai „Pilseta” – tikai divas
vērtības. Līdz ar, izmantojot pēdējo kolonu rezultātā ir saņemtas divas rezultātu
rindas:
Attēls 16. Transakciju skaits un to summa katrai klienta pilsētai
Izmantojot kolonu kombināciju GROUP BY daļā rezultātu ierakstu būs vairāk,
piemērām, darbinieka un klienta pilsētas kombinācija izdos 2*26=52 ierakstus, un
visu kolonu kombinācija izdos 2*26*26=1352 ierakstus.
5.2. ROLLUP vaicājumi
Papildus parastajiem agregātiem rezultātiem, ko var sagaidīt no GROUP BY
vaicājuma, ROLLUP paplašinājums veido grupas starpsummas no labās uz kreiso, un
kopējo summu. Ja vaicājuma uzskaitīto kolonnu skaits ir n, tiks ievadīti n+1
starpsummas.
Ir izmantots sekojošs vaicājums, lai aprēķinātu cik katrā pilsētā katrs
darbinieks izpildīja transakcijas:
Select Uzvards, Pilseta,
20
Count(*) As "Ierakstu skaits", Sum(Summa) As SummaFrom SkatsGroup By Rollup (Uzvards, Pilseta)ORDER BY Uzvards,Summa;
Vaicājumam ir sekojošs rezultāts:
UZVARDS PILSETA Ierakstu skaits SUMMAAnsons Liepāja 2 101,8Ansons Rīga 7 1163,7545Ansons 9 1265,5545Antropovs Liepāja 4 564,543Antropovs Rīga 10 1252,6335Antropovs 14 1817,1765Aņisimovs Liepāja 2 320,976Aņisimovs Rīga 9 804,702Aņisimovs 11 1125,678Aņiskovecs Liepāja 5 380,572Aņiskovecs Rīga 7 1432,785Aņiskovecs 12 1813,357Arsentjeva Rīga 5 877,47Arsentjeva Liepāja 5 945,75Arsentjeva 10 1823,22
…Vērzemnieks Liepāja 2 112,588Vērzemnieks Rīga 12 2151,6825Vērzemnieks 14 2264,2705
289 43411,913576 rows selected
Lai samazinātu starprezultātu daudzumu ir iespējams veikt daļējo PULLUP,
piemēram sekojošā veidā: Group By Uzvards, Rollup (Pilseta). Šajā gadījumā
vaicājuma rezultāts būs līdzīgs iepriekšējam tikai nebūs starpsummas pēc abām
kolonām.
5.3. CUBE vaicājumi
CUBE ģenerē starpsummas līdzīgi ROLLUP, bet klāt CUBE izveido
starprezultātus visām iespējam kombinācijām, ko var izveidot no norādītām kolonām.
Ja vaicājuma uzskaitīto kolonnu skaits ir n, tiks ievadīti n2 starpsummas.
Ir izmantots vaicājums kā iepriekšējā apakšnodaļā izmainot tikai ROLLUP uz
CUBE. Rezultātā ir izdotas tie paši ieraksti un 2 jauni ieraksti (atzīmēti ar sarkano):
21
UZVARDS PILSETA Ierakstu skaits SUMMAAnsons Liepāja 2 101,8Ansons Rīga 7 1163,7545Ansons 9 1265,5545Antropovs Liepāja 4 564,543Antropovs Rīga 10 1252,6335Antropovs 14 1817,1765Aņisimovs Liepāja 2 320,976Aņisimovs Rīga 9 804,702Aņisimovs 11 1125,678Aņiskovecs Liepāja 5 380,572Aņiskovecs Rīga 7 1432,785Aņiskovecs 12 1813,357Arsentjeva Rīga 5 877,47Arsentjeva Liepāja 5 945,75Arsentjeva 10 1823,22
…Vērzemnieks Liepāja 2 112,588Vērzemnieks Rīga 12 2151,6825Vērzemnieks 14 2264,2705
Liepāja 90 11448,549Rīga 190 31963,3645
289 43411,913576 rows selected
Ar kolonu skaitu palielināšu CUBE daļā, palielinās arī starpsummu skaits.
Piemērām šādam vaicājumam ir 590 rezultāti un 360 no tiem ir starpsummas.
Select Uzvards, Pilseta, Klients, Count(*) As "Ierakstu skaits", Sum(Summa) As SummaFrom SkatsGroup By CUBE (Uzvards, Pilseta, Klients)ORDER BY Uzvards,Summa;
Līdzīgi kā ar PULLUP, lai samazinātu starprezultātu daudzumu ir iespējams
veikt daļējo CUBE vaicājumu.
5.4. GROUPING vaicājumi
Var būt diezgan viegli vizuāli identificēt starpsummas no ROLLUP vai CUBE
vaicājumiem, bet lai automatizētu rezultātu apkopojumu ir nepieciešams kaut precīzāk
Null vērtības grupējuma kolonnās.
22
Tas ir iespējams atrisināt ar GROUPING funkciju. Tā izveido vienu kolonnu
kā parametru un atgriež "1", ja ROLLUP vai CUBE rezultātā dēļ kolonna satur Null
vērtības vai "0" par jebkuru citu vērtību, tostarp ja tā vērtība citu iemeslu dēļ ir Null.
Sekojošs vaicājums ir atkārtojums no CUBE vaicājuma, bet GROUPINF
funkcija ir pievienota katrai kolonai.
SELECT Uzvards, Pilseta, Count(*) As "Ierakstu skaits", Sum(Summa) As Summa, GROUPING(Uzvards) AS "Grupēšana pēc uzvārda", GROUPING(Pilseta) AS "Grupēšana pēc pilsētas"FROM SkatsGROUP BY CUBE (Uzvards, Pilseta)ORDER BY Uzvards,Summa;
UZVARDS PILSETA Ierakstu skaits SUMMA Grupēšana
pēc uzvārdaGrupēšana pēc pilsētas
Ansons Liepāja 2 101,8 0 0Ansons Rīga 7 1163,7545 0 0Ansons 9 1265,5545 0 1Antropovs Liepāja 4 564,543 0 0Antropovs Rīga 10 1252,6335 0 0Antropovs 14 1817,1765 0 1Aņisimovs Liepāja 2 320,976 0 0Aņisimovs Rīga 9 804,702 0 0Aņisimovs 11 1125,678 0 1Aņiskovecs Liepāja 5 380,572 0 0Aņiskovecs Rīga 7 1432,785 0 0Aņiskovecs 12 1813,357 0 1Arsentjeva Rīga 5 877,47 0 0Arsentjeva Liepāja 5 945,75 0 0Arsentjeva 10 1823,22 0 1…Vērzemnieks Liepāja 2 112,588 0 0Vērzemnieks Rīga 12 2151,6825 0 0Vērzemnieks 14 2264,2705 0 1
Liepāja 90 11448,549 1 0Rīga 199 31963,3645 1 0
289 43411,9135 1 178 rows selected
No tā var redzēt:
Grupēšana pēc uzvārda
Grupēšana pēc pilsētas Nozīme
0 0 Parastā starpsumma, kas varētu būt iegūta no
23
GROUP BY operatora
0 1 Starpsumma pēc uzvārda, ko var iegūt ar ROLLUP vai CUBE operatoriem
1 0 Starpsumma pēc pilsētas, ko var iegūt tikai ar CUBE operatoru
1 1 Vaicājuma kopsumma, ko var iegūt ar ROLLUP vai CUBE operatoriem
Ar šīm vērtībām tagad ir vieglāk izveidot programmu datu apkopošanai. Arī
GROUPING kolonas var būt izmantotas rezultātu kārtošanai vai filtrācijai:
SELECT Uzvards, Pilseta, Count(*) As "Ierakstu skaits", Sum(Summa) As Summa, GROUPING(Uzvards) AS "Grupēšana pēc uzvārda", GROUPING(Pilseta) AS "Grupēšana pēc pilsētas"FROM SkatsGROUP BY CUBE (Uzvards, Pilseta)HAVING GROUPING(Uzvards) = 1 OR GROUPING(Pilseta) = 1ORDER BY Uzvards,Summa;
UZVARDS PILSETA Ierakstu skaits SUMMA Grupēšana
pēc uzvārdaGrupēšana pēc pilsētas
Akantjevs 8 1079,326 0 1Ansons 9 1265,5545 0 1Antropovs 14 1817,1765 0 1Aņisimovs 11 1125,678 0 1Aņiskovecs 12 1813,357 0 1Arsentjeva 10 1823,22 0 1Āboliņš 15 1411,8885 0 1Balcers 9 1374,447 0 1Bernšteine 14 1510,768 0 1Bessonova 10 1919,6475 0 1Blauva 18 3160,694 0 1Bodžs 13 1897,892 0 1Boginskis 4 658,918 0 1Borovskis 3 205 0 1Brēdiķis 19 2822,951 0 1Duškins 12 2378,578 0 1Guževs 10 1379,581 0 1Ivanovs 4 458,9135 0 1Mihailovs 8 1074,3065 0 1Pakers 12 2287,34 0 1Petrišins 12 2364,5685 0 1Pūpoliņš 10 1366,619 0 1Sila 10 1887,628 0 1Slobodnik 12 1917,239 0 1
24
UZVARDS PILSETA Ierakstu skaits SUMMA Grupēšana
pēc uzvārdaGrupēšana pēc pilsētas
Suvorovs 16 2146,3515 0 1Vērzemnieks 14 2264,2705 0 1
Liepāja 90 11448,549 1 0Rīga 199 31963,3645 1 0
289 43411,9135 1 1
5.5. GROUPING_ID vaicājumi
Funkcija GROUPING_ID piedāvā kompaktāko alternatīvu starprezultātu
identifikācijai. Tā izvada dimensijas kolonas kā argumentus pēc GROUP BY līmeņa.
Kā piemēru var apskatīt vaicājumu, kas bija apskatīts ar GROUPING
funkciju:
SELECT Uzvards, Pilseta, Count(*) As "Ierakstu skaits", Sum(Summa) As Summa, GROUPING_ID(Uzvards, Pilseta) AS Grupēšana FROM SkatsGROUP BY CUBE (Uzvards, Pilseta)ORDER BY Uzvards,Summa;
UZVARDS PILSETA Ierakstu skaits SUMMA GrupēšanaAnsons Liepāja 2 101,8 0Ansons Rīga 7 1163,7545 0Ansons 9 1265,5545 1Antropovs Liepāja 4 564,543 0Antropovs Rīga 10 1252,6335 0Antropovs 14 1817,1765 1Aņisimovs Liepāja 2 320,976 0Aņisimovs Rīga 9 804,702 0Aņisimovs 11 1125,678 1Aņiskovecs Liepāja 5 380,572 0Aņiskovecs Rīga 7 1432,785 0Aņiskovecs 12 1813,357 1…Vērzemnieks Liepāja 2 112,588 0Vērzemnieks Rīga 12 2151,6825 0Vērzemnieks 14 2264,2705 1
Liepāja 90 11448,549 2Rīga 199 31963,3645 2
289 43411,9135 378 rows selected
25
6. SQL MODEL VAICĀJUMI
Bieži izstrādājot vaicājumus rodas problēmas milzīgo vaicājuma dēļ, īpaši gadījumos
ar aprēķinu iteratīviem metodēm, starprezultātu aprēķināšanām, risinājumiem, kas
pieprasa blakus vērtības utt. Tas vada pie ātrdarbības samazināšanas un koda
caurskatāmības bojāšanu. Lai atrisinātu šīs problēmas, ir piedāvāts izmantot SQL
MODEL operatoru.
SQL MODEL operators ir SELECT konstrukcijas paplašinājums, kas ir
pieejams sakot ar Oracle 10 versiju. MODEL ļauj izmantot SELECT rezultātus kā
daudzdimensiju masīvu, mainīt un pievienot elementus, veikt sarežģītas agregātas
funkcijas, un arī risināt problēmas, ko pirms tam tika risināts tikai ar PL/SQL. Tajā
pašā laikā valodas konstrukcijas ir labi caurskatāmi un saprotami.
MODEL operatora sintakse ir sekojošā:
MODEL [IGNORE NAV] [RETURN UPDATED ROWS] [PARTITION BY (partition_column_1, ...)] DIMENSION BY (dimension_column_1, ...) MEASURES (measured_column_1, ...) RULES [AUTOMATIC ORDER | ITERATE (value) [UNTIL (expression)]] ( rule_1, ... );
MODEL operators tiek izpildīts viens no pēdējam. Pēc tā ir izpildīts tikai
DISTINCT un ORDER BY operatori. Pielietošanas rezultātā aprēķini ir izvadīti
masīvā measured_column_n ar dimensijām dimension_column_n. Parametrs
PARTITION BY ir neobligāts un nosāka nodalījumus. Likumi tiek izpildīti
definēšanas kartībā.
MODEL operatoru darbā var apskatīt ar dimensiju tabulu „Darbinieku_Dim”
palīdzību. Pašlaik darbiniekam ar ID=1 ir alga 345 lati (sk. 17. att.). Ar likumu
MODEL operatora ir iespējams izmainīt to uz citu vērtību, piemērām 500 Ls, kā ir
redzams 18. attēlā.
26
Attēls 17. Darbinieka ar ID=1 alga
Attēls 18. Izmainīta darbinieka alga
Likumus arī var definēt visai grupai vai grupas daļai ar filtra palīdzību. To var
darīt sekojošā veidā:
Alga[Darbinieka_ID<20, Amats LIKE ‘Selle%’, any]
Ar šāda veida likumiem nevar veidot jaunus elementus, bet tikai atjaunot
vērtības jau eksistējošos elementos. Kā piemērs ir apskatīts uzdevums, kad ir
27
nepieciešams palielināt algu elektronodaļas darbiniekiem par 50% un arī apreķināt
vidējo algu katrā nodaļā. To var izdarīt ar sekojošo vaicājumu:
SELECT *FROM Darbinieku_DimMODEL DIMENSION BY (Darbinieka_Id,Amats, Nodala) MEASURES (Alga) RULES ( Alga[Any, Any, 'Electro'] = Alga[CV(Darbinieka_Id), CV(Amats),Cv(Nodala)] * 1.5, Alga[Null, Null, 'Electro'] = AVG(Alga)[Any,Any,'Electro'], Alga[Null, Null, 'Office'] = AVG(Alga)[Any,Any,'Office'], Alga[Null, Null, 'Paper'] = AVG(Alga)[Any,Any,'Paper'], Alga[Null, Null, 'PR'] = AVG(Alga)[Any,Any,'PR'], Alga[Null, Null, 'Valdība'] = AVG(Alga)[Any,Any,'Valdība'] )ORDER BY Amats,Nodala;
Attēls 19. MODEL vaicājuma rezultāts
28
7. PIVOT VAICĀJUMI
PIVOT vaicājumi iekļauj sevī rindu transformāciju kolonnās (pivot) vai
kolonnu transformāciju rindās (unpivot), lai radītu rezultātus pagriezta formātā.
Pagrieziens ir izplatīta metode, īpaši atskaišu ģenerēšanai, kas bija pieejams SQL
valodā un Oracle versijās ilgu laiku. Taču tikai Oracle 11. Versijā parādījās operatori
PIVOT un UNPIVOT. Šie operatori ir SELECT operatora paplašinājumi ar savu
sintaksi un struktūtu.
PIVOT operatora darbības ir pārsvarā zināmi: vairākas rindas tiek apkopotas
jeb agregātas un pagriezti, lai tiktu atspoguļotiem kā kolonnas, kur katra kolonna ir
atsevišķo agregāto datu kopa. Kopumā, to sintakse ir šāda:
SELECT ...FROM ...PIVOT ( pivot_clause pivot_for_clause pivot_in_clause )WHERE ...
kur pivot_clause - apraksta kolonas, kas tiks agregātas;
pivot_for_clause - apraksta kolonas, kas tiks grupēti un pagriezti;
pivot_in_clause - apraksta ierobežojumus pivot_for_clause
daļai.
PIVOT funkcija nav pieejama ORACLE SQL Developer 3.0.04 versija, līdz ar
to uzdevums ir izpildīts izmantojot Oracle Database 11g Express Edition. Pirmais
vaicājums var būt sekojošs:
SELECT *FROM Darbinieku_DimPivot ( Avg(Alga) For Nodala In ('Electro', 'Office', 'Paper', 'PR'));
Tomēr, kā ir ir redzms 20. attēlā rezultāts nav lietderīgs, jo tas izvada visu
informāciju un rezultātu apkopošana nav redzama.
29
Attēls 20. PIVOT vaicājums
Lai izlabotu situāciju, jādefinē apakškopu iepriekš:
WITH pivot_data AS (SELECT Nodala, Amats, AlgaFROM Darbinieku_Dim)SELECT * FROM pivot_dataPivot ( Avg(Alga) For Nodala In ('Electro', 'Office', 'Paper', 'PR'));
30
Attēls 21. Vidējā alga pēc amata katra nodaļā
Ja pievienot pivot_clause daļā nosaukumu, tad tā paradīsies arī
rezultātos. Tas ir svarīgi, lai īpaši paradīt kā dati ir agregēti vai kad ir vairāk nekā
viens rezultāts:
WITH pivot_data AS (SELECT Nodala, Amats, AlgaFROM Darbinieku_Dim)SELECT *FROM pivot_dataPivot ( Sum(Alga) as ALGA, COUNT(Alga) as Daudzums For Nodala In ('Electro', 'Office', 'Paper', 'PR'));
Attēls 22. Vidējā alga un darbinieku skaits pēc amata katra nodaļā
Pirms Oracle 11. versijai līdzīgu rezultātu bija iespējams sasniegt izmantojot
DECODE funkciju kopā ar agregācijas funkciju. Piemēram sekojošs vaicājums izdot
tādu pašu rezultātu kā iepriekšējs vaicājums.
SELECT Amats, avg(DECODE(Nodala, 'Electro', ALGA, 0)) AS "'Electro'_ALGA", count(DECODE(Nodala, 'Electro', ALGA, 0)) AS "'Electro'_DAUDZUMS", avg(Decode(Nodala, 'Office', Alga, 0)) AS "'Office'_ALGA", count(DECODE(Nodala, 'Office', ALGA, 0)) AS "'Office'_DAUDZUMS", avg(DECODE(Nodala, 'Paper', ALGA, 0)) AS "'Paper'_ALGA", count(DECODE(Nodala, 'Paper', ALGA, 0)) AS "'Paper'_DAUDZUMS",
31
avg(DECODE(Nodala, 'PR', ALGA, 0)) AS "'PR'_ALGA", count(DECODE(Nodala, 'PR', ALGA, 0)) AS "'PR'_DAUDZUMS"From Darbinieku_DimGROUP BY Amats;
32
8. MATERIALIZĒTIE SKATI
Materializētie skati pirmo riezi parādījās Oracle 8. versijā kā daļa no
komponentes Pārskatu vadība. Daudzi cilvēki ikdienā lieto materializētos skatus,
vienīgā atšķirība ir, ka viņi tos lieto ar citu vārdu, piemēram, summārās vai agregātu
tabulas.
Materializētie skati ļauj būtiski samazināt saliktu vaicājumu ar plašu atribūtu
agregāciju izpildes laiku. Tiek izmantota arī kopsavilkumu konsultanta komponente,
kas iesaka administratoram, kādus materializētos skatus radīt, dzēst un saglabāt.
Lielākos materializēto skatu ieguvumus gūs lietotājs, kas lietos datu noliktavu.
Tiks izmantots vaicājumu pārrakstīšanas mehānisms Oracle serverī automātiski
pārrakstīs vaicājumu tā, lai tiktu izmantots materializētais skats.
Materializētie skati pilda dažādas funkcijas: vaicājumu izpildes ātruma
palielināšana, datu kopēšana, datu apstrāde un apkopošana. Informāciju no
materializētajiem skatiem var izgūt ar vienkāršu SELECT vaicājumu palīdzību.
Materializētais skats ir saglabāta vaicājuma atbilde. Lai izveidotu
materializētu skatu, ir nepieciešams definēt:
1) apraksts, kā fiziski tiek glabāti dati ;
2) kad vajag aizpildīt materializēto skatu uzreiz pēc izveidošanas vai
vēlāk;
3) kā atjaunot datus, kad dati atbilstošās tabulās mainās;
4) kad veikt datu atjaunošanu: katras transakcijas beigās, vai pēc
pieprasījuma;
5) izmantot skatu, lai pārrakstītu vaicājumu, vai nē;
6) SELECT operators, kurš apraksta materializēta skata saturu.
Pirms materializēta skata veidošanas datu bāzē ir iespējams sakumā pārbaudīt
to ar utilītu EXPLAIN_MVIEW. Utilīta palīdz noskaidrot, vai materializētā skata
vaicājumu būs iespējams ātri atjaunot, vai nē. Utilīta paskaidros, kādas rindiņas
nepietiek materializēta skatā definējumā.
33
Darbā izveidotais materializētais skats ir izmantots darbam ar transakcijām
pēc darbinieka uzvārda, klienta ID, piegādes pilsētas un transakcijas summas.
Materializētā skata izveidošana notiek ar sekojošo vaicājumu:
CREATE MATERIALIZED VIEW Materializetais_Skats BUILD IMMEDIATE ENABLE QUERY REWRITE AS SELECT C.Uzvards, F.Klients, A.Pilseta, (F.Daudzums*P.Cena*(100-K.Atlaide)/100) AS Summa FROM Faktu_Tabula F, Precu_Dim P, Klientu_Dim K, Darbinieku_Dim D, Cilveku_Dim C, Adresu_Dim A WHERE F.Prece = P.Preces_Id AND F.Klients = K.Klienta_Id AND F.Darbinieks = D.Darbinieka_Id AND D.Cilveks_Fk = C.Cilveka_Id AND K.Adrese_FK = A.Adreses_ID;
34
Attēls 23. Materializētā skata izveidošana
SQL komandu izpildes plāna ierakstīšanai izmanto tabulu PLAN_TABLE.
Vaicājuma izpildes plāna iegūšana un ierakstīšana tabulā PLAN_TABLE:
EXPLAIN PLANSET STATEMENT_ID = 'Transakciju_skats' FOR SELECT C.Uzvards, F.Klients, A.Pilseta, (F.Daudzums*P.Cena*(100-K.Atlaide)/100) AS Summa FROM Faktu_Tabula F, Precu_Dim P, Klientu_Dim K, Darbinieku_Dim D, Cilveku_Dim C, Adresu_Dim A WHERE F.Prece = P.Preces_Id AND F.Klients = K.Klienta_Id AND F.Darbinieks = D.Darbinieka_Id
35
AND D.Cilveks_Fk = C.Cilveka_Id AND K.Adrese_FK = A.Adreses_ID;
Attēls 24. Plāna ierakstīšana
Izpildes plāna izvade ir ierakstīts tabulā PLAN_TABLE un to var apskatīt ar
SELECT vaicājumu:
SELECT Statement_Id, Operation, OptionsFROM Plan_TableWHERE Statement_Id='Transakciju_skats';
36
Attēls 25. SELECT vaicājuma izpilde
Ir iespējams pārbaudīt materializētā skata neizmantošanu ar jauno izpildes
plāna ierakstīšanu un tālāko plāno apskati:
EXPLAIN PLANSET STATEMENT_ID = 'Skata_neizmantosana' FOR SELECT C.Uzvards, F.Klients, A.Pilseta, (F.Daudzums*P.Cena*(100-K.Atlaide)/100) AS Summa FROM Faktu_Tabula F, Precu_Dim P, Klientu_Dim K, Darbinieku_Dim D, Cilveku_Dim C, Adresu_Dim A WHERE F.Prece = P.Preces_Id AND F.Klients = K.Klienta_Id AND F.Darbinieks = D.Darbinieka_Id AND D.Cilveks_Fk = C.Cilveka_Id AND K.Adrese_FK = A.Adreses_ID;
SELECT Statement_Id, Operation, OptionsFROM Plan_TableWHERE Statement_Id='Skata_neizmantosana';
37
38
9. SECINĀJUMI
Darba mērķis tiek definēts kā izpētīt datu noliktavas tehnoloģija. Mērķa
sasniegšanai tika izdomāta uzskaitīšanas sistēma biroja preču veikalam SIA
VEIKALS, kas satur informāciju par precēm, klientiem, darbiniekiem un to
mijiedarbības vēsturi jeb transakcijām. Tika izdomātas datu bāzes tabulas un objekti,
kā arī loģiskas saites starp tām. Kā rezultāts, darbā ir aprakstīta darbība ar datu
noliktavas tehnoloģijām, kas ietver sevī vairākus posmus tādus kā faktu tabulas,
dimensiju tabulu, materializētu skatu utt izmantošana. Ir definēti un izpildīti vairāki
vaicājumi.
Datu noliktavas ir pielietotas vairākās jomās, jo tās ļauj saglabāt un apstrādāt
datus. Datu noliktavas var būt izmantotas uzskaitīšanas sistēmās, finanšu sistēmās,
krājumu vadības sistēmās un vairākās citās sistēmās.
Viena no stiprām pusēm šajā datu bāzē ir dimensiju modelēšana. Tā ir metode,
kas tiek lietota projektējot datu noliktavas datu struktūras. Šī tehnoloģija nodrošina
datu struktūras vieglu uztveramību un izprotamību. Dimensiju modeļa priekšrocības ir
sekojošas:
Dimensiju modelis ir labi izprotams un no tā vienkārši var iegūt
nepieciešamos datus.
Visas dimensijas ir loģiski ekvivalentas. Līdz ar to vaicājumi ir
simetriski, vienveidīgi.
Dimensiju modelis ir viegli paplašināms, pievienojot jaunus faktus,
jaunas dimensijas, jaunus dimensiju atribūtus.
Jaunu apakšdimensiju ieviešana.
Praktiskais darbs tika izpildīts aptuveni 40 stundu laikā. Darba ietvaros ir
izveidotas 5 dimensiju tabulas un viena faktu tabula, kas ir savienotas sniegpārsla
veidā. Klāt izveidotām tabulām, darbā ir izpildīti un aprakstīti vairāki vaicājumi.
Darbā iekļauti vaicājumi neierobežo visus vaicājumus, kas tika izpildīti darba procesa,
bet darbā ir iekļauti tikai labākos piemērus pēc autora domām.
39
Pirmais apskatītais vaicājumu klāsts ir grupēšanas vaicājumi, kur autors
papildi izpētīja vairākus grupēšanas operatorus kā ROLLUP, GROUPING_ID un
citus.
Otrā vaicājumu grupa izmantoja MODEL operatoru. Principā MODEL netiek
izmantots bieži, jo gandrīz visu to darbu var realizēt ar analītiskām funkcijām, bet ko
nevar – parast netiek risināts datu bāzes līmenī. Bet tomēr ir izdevīgi izmantot
MODEL, kad:
Ir jāģenerē tiešam sarežģīts vaicājums, kas ir labi caurskatāms;
Atlase nav iespējama par ar analītiskām funkcijām;
Vaicājums tiek ģenerēts ar augsto valodas palīdzību, jo vieglāk definēt
MODEL likumus nekā analītiskie likumi;
Ir veikta resursuietilpīga skaitļošana.
Pēdējā vaicājumu grupa izmantoja materializētus skatus.
Darba gaita bija dažādas grūtības. Daļa no tām tika izraisīta nepareizas
sintakses dēļ vai nepareizas datu bāzes vienību definēšanas secību.
Vēl viena problēma bija saistīta ar to, ka PIVOT funkcija nav pieejama Oracle
Developer rīkā, un bija jāmeklē cits rīks, kas atbalstu šo funkciju. Rezultātā tika
izvelēts Oracle Database 11g Express Edition, jo tas bija līdzīgāk Oracle Developer
pēc darbības principa nekā citi rīki.
Kaut gan darba izstrāde aizņēma daudz laika, tomēr darbs ir bijis interesants
un dot daudz prasmju un zināšanas, kas noteikti būs nepieciešamas turpmākajā
mācību laikā un profesionālā darbībā.
Apkopojot visu izdarīto, autors ir ļoti apmierināts ar paveikto darbu, jo visa
izdomāta struktūra funkcionē korekti un visi informācijas objekti mijiedarbojoties
savā starpā pilnīgi saskaņā ar uzstādītu loģiku, kas ļauj secināt, ka šo datu bāzes
paraugu var realizēt arī reālajā dzīvē.
40
10. IZMANTOTĀS LITERATŪRAS SARAKSTS
1) Jāņa Eiduka lekciju konspekts
2) Jāņa Eiduka disks ar piemēriem
3) Oracle® Database Data Warehousing Guide 11g Release 2 (11.2).
Chapter 22 SQL for Modeling
4) Oracle® Database Performance Tuning Guide 11g Release 1 (11.1).
Chapter 12 Using EXPLAIN PLAN
5) Oracle® Database Data Warehousing Guide 11g Release 1 (11.1).
Chapter 8 Basic Materialized Views
6) Oracle® Database Data Warehousing Guide 11g Release 1 (11.1).
Chapter 9 Advanced Materialized Views
7) The SQL Model Clause of Oracle Database 10g.
41