praktiskais darbs nr.1 - web viewmūsu intensīvās dzīves apstākļos arvien vairāk pieaug...
TRANSCRIPT
RĪGAS TEHNISKĀ UNIVERSITĀTERĪGAS TEHNISKĀ UNIVERSITĀTE
DATORZINĀTNES UN INFORMĀCIJAS TEHNOLOĢIJASDATORZINĀTNES UN INFORMĀCIJAS TEHNOLOĢIJAS
FAKULTĀTEFAKULTĀTE
LIETIŠKO DATORSISTĒMU INSTITŪTSLIETIŠKO DATORSISTĒMU INSTITŪTS
INFORMĀTIKAS UN PROGRAMMĒŠANAS KATEDRAINFORMĀTIKAS UN PROGRAMMĒŠANAS KATEDRA
«Informācijas sistēmas un CASE rīki»
1. praktiskais darbs
«SQL vaicājumu optimizācija»
Izstrādāja: Arnis KiršnersI DMIO, 2. grupa
Apl. Nr.: 051RDB243Pārbaudīja: prof. J. Eiduks
Rīga, 2009.
SatursUzdevuma nostādne..............................................................................................4
Ievads....................................................................................................................5
1. Datubāzes izveide Oracle vidē....................................................................6
2. Vaicājumu izveidošana................................................................................9
2.1. Pirmais vaicājums.................................................................................9
2.2. Otrais vaicājums.................................................................................10
2.2.1. Relāciju algebras skaidrojums otrajam vaicājumam......................10
2.3. Trešais vaicājums...............................................................................10
2.3.1. Relāciju algebras skaidrojums trešajam vaicājumam....................11
2.4. Ceturtais vaicājums (HAVING).........................................................11
2.5. Piektais vaicājums (EXISTS).............................................................11
2.5.1. Relāciju algebras skaidrojums piektajam vaicājumam..................12
2.6. Sestais vaicājums (GROUP BY CUBE)............................................12
2.7. Septītais vaicājums (OVER)...............................................................13
2.8. Astotais vaicājums (hierarhiskie).......................................................14
2.9. Devītais vaicājums (pakārtots – FROM bez WHERE)......................15
2.10. Desmitais vaicājums (pakārtots – FROM ar WHERE)......................16
2.10.1. Relāciju algebras skaidrojums desmitajam vaicājumam.............16
2.11. Vienpadsmitais vaicājums (pakārtots – SELECT).............................16
2.11.1. Relāciju algebras skaidrojums vienpadsmitajam vaicājumam.....17
2.12. Divpadsmitais vaicājums (pakārtots – HAVING)..............................17
3. Izpildes plāna iegūšana un analīze.............................................................18
3.1. Izpildes plāns pirmajam vaicājumam.................................................20
3.2. Izpildes plāns otrajam vaicājumam....................................................21
3.3. Izpildes plāns trešajam vaicājumam...................................................22
3.4. Izpildes plāns ceturtajam vaicājumam................................................23
3.5. Izpildes plāns piektajam vaicājumam.................................................24
3.6. Izpildes plāns sestajam vaicājumam...................................................25
3.7. Izpildes plāns septītajam vaicājumam................................................26
3.8. Izpildes plāns astotajam vaicājumam.................................................27
3.9. Izpildes plāns devītajam vaicājumam.................................................28
3.10. Izpildes plāns desmitajam vaicājumam..............................................29
3.11. Izpildes plāns vienpadsmitajam vaicājumam.....................................30
3.12. Izpildes plāns divpadsmitajam vaicājumam.......................................31
4. Trīs ieteikumu (HINTS) realizācija...........................................................33
4.1. Pirmā ieteikuma realizācija................................................................34
4.2. Otrā ieteikuma realizācija...................................................................35
4.3. Trešā ieteikuma realizācija.................................................................37
5. Secinājumi.................................................................................................39
Izmantotās literatūras saraksts............................................................................41
Uzdevuma nostādne
Datubāzes izveide vai esošas datubāzes reducēšana izmantošanai ORACLE vidē ;
Vaicājumu izveidošana;
5 vaicājumiem izpildāmās relāciju algebras komandas;
Izpildes plānu iegūšana un realizācija;
3 ieteikumu realizācija;
Secinājumi.
DBVS-5 © Arnis Kiršners – 2009 4
Ievads
Mūsu intensīvās dzīves apstākļos arvien vairāk pieaug glabājamo datu apjomi. Tāpēc
tiek patērēts arī lielāks laika patēriņš, lai izgūtu vajadzīgo informāciju no liela datu apjoma
(miljoniem ierakstu). Un ja nu vēl tas ir saistīts ar lielām datubāzēm, kuru datu apjoms
mērāms terabaitos, tad izgūt pieprasīto informāciju un papildus vēl veikt nelielus aprēķinus ar
pieprasītajiem datiem – prasa ievērojamu laika patēriņu. Lai risinātu šo problēmu, Oracle vidē
tiek izmantots SQL optimizātors, kas ar ieteikumu un plānu palīdzību realizē SQL vaicājumu
optimizāciju Oracle vidē. Optimizātors ir koda fragments, kas apraksta Oracle datu apstrādes
modeli. Pielietojot izveidoto datu apstrāde modeli, optimizātors cenšas efektīvi pārveidot SQL
vaicājumu izpildes plānā.
DBVS-5 © Arnis Kiršners – 2009 5
1. Datubāze
s izveide Oracle vidē
Lai varētu efektīvi strādāt Oracle vidē, jaunizveidojamo datubāzi izvieto atsevišķā
tabulas telpā ar nosaukumu SQLOPT, kuru izveido ar rīka SQLPlus palīdzību, pievienojoties
kā system lietotājs. Izveidotajai tabulas telpai izveido lietotāju ar paroli un piešķir lietošanas
tiesības, šo procesu izvedi, skatīt 1. attēlā.
1. att. Tabulas telpas un lietotāja izveide
Tā kā praktiskā darba veikšanai tiek piedāvāts izmantot datubāzi, kura satur datus par
personām, to algām, valstīm un nodaļām, kas realizēta Microsoft Access 2000 formātā, bet šī
praktiskā darba specifika pieprasa realizācijas veikt Oracle vidē, tāpēc nepieciešams ir veikt
datubāzes transformāciju uz Oracle vidi. Atveram doto datubāzi Microsoft Access 2007 vidē,
izmantojot iebūvēto rīku datubāzu eksportam, izvēlamies sadaļu «Papildus», kurā izvēlamies
«ODBC datu bāze», atveras saskarne, skatīt 2. attēlu, kurā norādām attiecīgās tabulas
nosaukumu. Tālāk tiek atvērta saskarne, skatīt 3. attēlu, kur norāda ceļu uz kuru datu bāzi tiks
DBVS-5 © Arnis Kiršners – 2009 6
2. att. Eksportēšanas saskarnes logs rīkā MS Access 2007
veikta transformācija un jāpiešķir datu struktūras nosaukums (DSN). Tālāk jānospiež taustiņš
«Jauns», tiks atvērta jauna saskarne, skatīt 4. attēlu, kurā jāizvēlas datu avota tips – mūsu
3. att. Saskarne datu struktūras nosaukuma izveidei
DBVS-5 © Arnis Kiršners – 2009 7
4. att. Saskarne datu avota izvēlei
gadījumā Oracle in OraDb 10g_home1. Turpinājumā spiežam taustiņu tālāk, kā rezultātā tiek
atvērts jauns saskarnes logs, skatīt 5. attēlu, kurā jānorāda datubāzes nosaukums, lietotājs un
parole. Tiks veikta datu struktūru transformācija.
5. att. Saskarne savienojumam ar datubāzi
Transformētajām datu struktūrām: tabulās ALGAS, VALSTIS un NODALAS,
jāizveido primārās atslēgas, bet tabulai PERSONAS trīs sekundārās atslēgas ar atsauci uz
tabulām, kurās izveidotas primārās atslēgas. Lai aplūkotu izveidotās struktūras, izmantosim
rīka Toad for Oracle 8.5 ER diagrammu attēlotāju, skatīt 6. attēlu.
DBVS-5 © Arnis Kiršners – 2009 8
6. att. Transformēto datu struktūru attēlojums ar rīku Toad for Oracle 8.5
DBVS-5 © Arnis Kiršners – 2009 9
2. Vaicājum
u izveidošana
Kad datubāze ir izveidota var sākt vaicājumu veidošanu. Šajā nodaļā veidosim dažādas
sarežģītības vaicājumus, veidojot tos no vienas vai vairākām tabulām. Tā kā vaicājumu valoda
tiek bāzēta uz relācijas algebras darbībām, tad vaicājumiem pēc izvēles aplūkosim relāciju
algebras darbības un tās var būt sekojošas:
Selekcija;
Projekcija;
Savienojums;
Pārklājums;
Apvienošana;
Starpība;
Dekarta reizinājums;
Dalījums;
Dabiskais savienojums.
2.1. Pirmais vaicājums
Ar šī vaicājuma palīdzību izgūsim no vienas tabulas (VALSTIS) visus atribūtus un
visus ierakstus, kas atrodas dotajā tabulā. Vaicājumu teksts ir sekojošs, realizāciju skatīt 7.
attēlā:SELECT VALSTS_KODS, VALSTS_NOS, PILSONIBAS_NOSFROM VALSTIS
DBVS-5 © Arnis Kiršners – 20097.att. Pirmā vaicājuma rezultāts
10
2.2. Otrais vaicājums
Ar šī vaicājuma palīdzību izgūsim no vienas tabulas (PERSONAS) izvēlētus atribūtus
(vārds, uzvārds, personas kods, dzimšanas datums, valsts kategorija, tips, dzimte) un atlasītus
ierakstus ar operatoru OR un AND palīdzību. Šis vaicājums atlasīs visus, kas ir no Latvijas ar
kategoriju B, uzvārdu Ābele un vārdu Klāvs vai Līga. Vaicājumu teksts ir sekojošs,
realizāciju skatīt 8. attēls:SELECT VARDS, UZVARDS, PERS_KODS, DZIM_DAT, VALSTS, KATEGORIJA, TIPS,
DZIMTEFROM PERSONASWHERE (((VARDS='KLAVS') OR (VARDS='LIGA')) AND (VALSTS='LAT') AND
(KATEGORIJA='B') AND (UZVARDS='ABELE'))
8. att. Otrā vaicājuma rezultāts
2.2.1. Relāciju algebras skaidrojums
otrajam vaicājumam
Šajā vaicājumā tiek realizētas sekojošas relāciju algebras darbības:
Projekcija – no visas tabulas PERSONAS laukiem tiek atlasīti izvēlēti atribūti:
VARDS, UZVARDS, PERS_KODS, DZIM_DAT, VALSTS, KATEGORIJA, TIPS,
DZIMTE;
Selekcija – ar nosacījumu operatora WHERE palīdzību tiek, kurā iekļauti operatori
AND un OR tiek atlasītas personas ar vārdu Klāvs vai Līga, ja tiem ir kopīgs uzvārds
Ābele, tie ir no Latvijas un kategorija B.
2.3. Trešais vaicājums
Vaicājumā no divām tabulām (PERSONAS un ALGAS) izgūt tās personas, kuru
dzimšanas datums ir 020615, vaicājuma rezultātu skatīt 9. attēlā, bet SQL kods ir sekošs:SELECT A.ID, A.VALSTS, A.DZIM_DAT, A.PERS_KODS, A.VARDS, A.UZVARDS,
B.VIDEJA_ALGA FROM PERSONAS A, ALGAS BWHERE ((A.ID=B.ID) AND (A.DZIM_DAT='020615'))
9. att. Trešā vaicājuma rezultāts
DBVS-5 © Arnis Kiršners – 2009 11
2.3.1. Relāciju algebras skaidrojums
trešajam vaicājumam
Savienošana – tiek savienotas divas tabulas PERSONAS un VALSTIS atbilstoši saites
1:N nosacījumiem, tas nozīmē, ka tie ģenerēti vienas tabulas rindu dublikāti, kas
savienoti ar otras tabulas rindām;
Projekcija – no visas tabulas PERSONAS laukiem tiek atlasīti izvēlēti atribūti:
VARDS, UZVARDS, PERS_KODS, DZIM_DAT, VALSTS, KATEGORIJA, TIPS,
DZIMTE;
Selekcija – ar nosacījumu operatora WHERE palīdzību, kurā iekļauti operatori AND
un OR tiek atlasītas personas ar vārdu Klāvs vai Līga, ja tiem ir kopīgs uzvārds Ābele,
tie ir no Latvijas un kategorija B.
2.4. Ceturtais vaicājums (HAVING)
Vaicājumos ar HAVING iespējams izmantot, kā parastos tā arī korelējošos
apakšvaicājumus. Korelējošos apakšvaicājumos par ārējām atsaucēm jāizmanto tikai tie
vaicājuma elementi, kuri tieši tiek izmantoti HAVING frāzē. Jo HAVING frāzē var izmantot
tikai agregātfunkcijas, kurām par argumentiem kalpo tekošā vaicājuma atribūtu nosaukumi,
vai atribūti kuri tiek izmantoti frāzē GROUP BY. Par iemeslu tam kalpo frāzes HAVING
predikāti, kas tiek novērtēti kā tabulas rindu grupa. No kā izriet, ka korelējošie
apakšvaicājumi tiks izpildīti katrai grupai. Ar vaicājuma, skatīt zemāk, palīdzību tiek izgūti tie
Jāņi ar attiecīgo uzvārdu, kuru vārds un uzvārds sakrīt (dotajā datubāzē) vairāk kā trīs reizes,
vaicājuma rezultātu skatīt 10. attēlā.SELECT A.VARDS, A.UZVARDSFROM PERSONAS A, ALGAS BWHERE ((A.ID=B.ID) AND (A.VARDS='JANIS'))GROUP BY A.VARDS, A.UZVARDSHAVING COUNT(A.VARDS) > 3
10. att. Ceturtā vaicājuma rezultāts
2.5. Piektais vaicājums (EXISTS)
Unārais salīdzinājuma operators EXISTS pārbauda vai kopa ir tukša, kura specificēta tā
argumentā. Ja kopa ir netukša – predikāts EXISTS saņem stāvokli patiess, bet ja tukša – DBVS-5 © Arnis Kiršners – 2009 12
aplams. Variantā ar loģiku NOT EXISTS loģika tiek mainīta uz pretējo pusi. Operators
EXISTS var tikt izmantots WHERE un HAVING frāzēs. Ar nākamā piemēra palīdzību tiek
realizēts vaicājums, kurā operators EXISTS tiek izmantots kā korelējošs vaicājums. EXISTS
operators atgriezīs visas tās personas, kuru uzvārds ir Bērziņš un algas apmērs ir lielāks par
90, savukārt izvadīts tiks atlasīto personu vārdi un uzvārdi, vaicājuma realizāciju skatīt 11.
attēlā, bet vaicājums teksts ir sekojošs:SELECT VARDS, UZVARDSFROM PERSONAS AWHERE EXISTS (SELECT * FROM ALGAS BWHERE (B.ID=A.ID) AND (A.UZVARDS='BERZINS') AND (B.FAKTISKA_ALGA>90))
11. att. Piektā vaicājuma rezultāts
2.5.1. Relāciju algebras skaidrojums
piektajam vaicājumam
Projekcija – apakšvaicājumā no tabulas ALGAS tiek atlasīti visi atribūti;
Selekcija – apakšvaicājumā no tabulas ALGAS ar nosacījumu operatora WHERE
palīdzību, kurā iekļauti operatori AND tiek atlasītas personas ar uzvārdu Bērziņš un
faktisko algu, kas lielāka par 90;
Projekcija – pamata vaicājumā no tabulas PERSONAS laukiem tiek atlasīti atribūti:
VARDS, UZVARDS;
Selekcija – pamata vaicājumā ar nosacījumu operatora WHERE palīdzību, kurā
iekļauts operators EXISTS tiek atgriezta vērtība patiess, ja izpildās apakšvaicājuma
nosacījumi.
2.6. Sestais vaicājums (GROUP BY CUBE)
Frāze GROUP BY CUBE, kas SELECT teikumā formē grupas pēc visām norādītām
dimensiju kombinācijām, tādā veidā nodrošinot visu to vērtību agregāciju un kopējo vērtību
agregāciju. Frāze CUBE, it īpaši efektīvi, pielietojama vaicājumos, kuros nepieciešama datu
agregācija brīvi izvēlētā datu kuba dimensijās. Agregātu funkcijās CUBE un ROLLUP un
tikai šajās var izmantot funkciju GROUPING, kura tiek izmantota viena atribūta agregācijai
un atgriež vērtību 1. Operators UPPER nodrošina vaicājuma rezultātā attēlot tam pakārtotās
vērtības. Šī vaicājuma rezultātā tiks izvadīti pensiju tipi, kas saskaitīti pa valstīm atsevišķi un
DBVS-5 © Arnis Kiršners – 2009 13
kopā, saskaitīti visi tipi katrai valstij un visi tipi pa visām valstīm kopā, vaicājuma realizāciju
skatīt 12. attēlā, savukārt vaicājums ir sekojošs:
SELECT DECODE(GROUPING(B.TIPS), 1, 'VISI TIPI KOPA', UPPER(B.TIPS)) AS TIPI, DECODE(GROUPING(A.VALSTS_KODS), 1, 'VALSTIS KOPA', UPPER(A.VALSTS_KODS)) AS "VALSTIS", COUNT(*) AS "TIPU SKAITS"
FROM VALSTIS A, PERSONAS BWHERE (A.VALSTS_KODS=B.VALSTS) GROUP BY CUBE (B.TIPS, A.VALSTS_KODS)
12. att. Sestā vaicājuma rezultāts
2.7. Septītais vaicājums (OVER)
Ar OVER tipu jeb klona tabulām realizēsim vaicājumu, kas izvadīs faktisko algu no
tabulas ALGAS attiecīgajam tipam no tabulas PERSONAS, ja atribūta SAKUMA_DATUMS
tabulā ALGAS vērtība ir 20010501. Operators OVER nodrošina, ka ar PARTITION BY pēc
atribūta TIPS no tabulas PERSONAS tiks summēti attiecīgie lauki atribūtam
FAKTISKA_ALGA no tabulas ALAGAS. Citiem vārdiem sakot tiks izveidotas klona tabula
ar kuru palīdzību tiek nodrošināt attiecīgo lauku summēšana, vaicājuma rezultātu skatīt 13.
attēlā, savukārt vaicājuma teksts ir sekojošs:
SELECT A.TIPS, B.FAKTISKA_ALGA, SUM(B.FAKTISKA_ALGA)OVER (PARTITION BY A.TIPS) "TIPAM KOPA"
DBVS-5 © Arnis Kiršners – 2009 14
FROM PERSONAS A, ALGAS BWHERE (A.ID=B.ID) AND (B.SAKUMA_DATUMS=20010501)
13. att. Septītā vaicājuma rezultāts
2.8. Astotais vaicājums (hierarhiskie)
Hierarhiskie vaicājumu nodrošina datu sadalīju līmeņos vai grafa (koka) zaros, kā arī
iespēju veikt rekursīvos vaicājumus. Frāze START WITH norāda koka sakni, frāze
CONNECT BY norāda kādā veidā ir savstarpēji saistīti vecāku un bērnu virsotnes, kādi
atribūti tiek lietoti šo saišu nodrošināšanai. Pseido atribūts LEVEL realizē papildus atribūta
lauku, kurā sistēma glabā noteikta tipa datus, kas raksturo dotā līmeņa stāvokli hierarhijā. Lai
realizētu hierarhisko vaicājumu, tabulā NODALAS pievieno jaunu atribūtu PAKLAUTIBA,
kas realizē nodalu struktūru, fragments no pievienotajām vērtībām aplūkojams 14. attēlā.
DBVS-5 © Arnis Kiršners – 2009 15
14. att. Modificētās tabulas NODALAS modifikācija
Pēc tabulas modifikācijas var veidot vaicājumu, ar kuru izvada tās pilsētas, kas atrodas
hierarhijas 1 līmenī, vaicājuma rezultātu skatīt 15. attēlā, bet vaicājuma kods ir sekojošs:SELECT PILSETAFROM NODALASSTART WITH PAKLAUTIBA=1CONNECT BY PRIOR PILSETA=ID
15. att. Astotā vaicājuma realizācija
2.9. Devītais vaicājums (pakārtots – FROM bez WHERE)
Frāzē FROM var atrasties ne tikai tabulu nosaukumi, bet arī tabulu atgriezošie
apakšvaicājumi. FROM frāze var iekļaut apakšvaicājumus, piemēram, kas veic dažāda veida
aprēķinus. Šajā piemērā realizēts vidējās vērtības aprēķins attiecīgajam atribūtam, pie tam vēl
pielietojot noapaļošanas operatoru ROUND. FROM apakšvaicājums realizē tabulā ALGAS
atribūtu FAKTISKA_ALGA un VIDEJA_ALGA vidējo vērtību aprēķinu, vaicājuma
rezultātu skatīt 16. attēlā, bet vaicājuma teksts ir sekojošs:SELECT A.VA AS "VID.FAKT.ALGA",
A.VV AS "VID.VID.ALGA"FROM (SELECT ROUND(AVG(FAKTISKA_ALGA),2) AS VA FROM ALGAS) A,
(SELECT ROUND(AVG(VIDEJA_ALGA),2) AS VV FROM ALGAS)A
16. att. Devītā vaicājuma realizācijaDBVS-5 © Arnis Kiršners – 2009 16
2.10. Desmitais vaicājums (pakārtots – FROM ar WHERE)
Ar sekojošā pakārtotā vaicājuma palīdzību izgūsim no tabulām PERSONAS un ALGAS
tos pilsoņus, kuru faktiskā alga ir virs 90 ir no Latvijas un algas sākuma datums ir 20010101.
Vaicājuma realizāciju skatīt 17. attēlā, teksta kods ir sekojošs:SELECT C.VARDS, C.UZVARDS, C.VALSTS, C.SAKUMA_DATUMS, C.FAKTISKA_ALGAFROM (SELECT B.VARDS, B.UZVARDS, B.VALSTS, A.SAKUMA_DATUMS, A.FAKTISKA_ALGAFROM PERSONAS B, ALGAS AWHERE B.ID=A.ID AND A.FAKTISKA_ALGA>90) CWHERE C.VALSTS='LAT' AND C.SAKUMA_DATUMS='20010101'
17. att. Desmitā vaicājuma realizācija
2.10.1. Relāciju algebras skaidrojums
desmitajam vaicājumam
Savienošana – apakšvaicājumā tiek savienotas divas tabulas PERSONAS un ALGAS
atbilstoši saites 1:N nosacījumiem, tas nozīmē, ka tie ģenerēti vienas tabulas rindu
dublikāti, kas savienoti ar otras tabulas rindām;
Projekcija – apakšvaicājumā no tabulām PERSONAS un ALGAS laukiem tiek atlasīti
izvēlēti atribūti: VARDS, UZVARDS, PERS_KODS, VALSTS,
SAKUMA_DATUMS, FAKTISKA_ALGA;
Selekcija – apakšvaicājumā ar nosacījumu operatora WHERE palīdzību, kurā iekļauts
operators AND tiek atlasītas personas, kuru alga ir virs 90;
Projekcija – pamata vaicājumā no iegūtās apakšvaicājuma tabulas tiek atlasīti atribūti:
VARDS, UZVARDS, PERS_KODS, VALSTS, SAKUMA_DATUMS,
FAKTISKA_ALGA;
Selekcija – pamata vaicājumā no apakšvaicājuma iegūtajiem rezultātiem ar
nosacījumu operatora WHERE palīdzību, kurā iekļauts operators AND tiek atlasītas
personas no Latvijas un algas sākuma datumu 20010101.
2.11. Vienpadsmitais vaicājums (pakārtots – SELECT)
Ar šī vaicājuma palīdzību izgūsim to pilsoņu uzvārdus no tabulas PERSONAS, kuru
faktiskā alga tabulā ALGAS sastāda 104,13. Vaicājuma rezultātu skatīt 18. attēlā, savukārt
vaicājuma teksts ir sekojošs:SELECT (SELECT B.UZVARDS
FROM PERSONAS BDBVS-5 © Arnis Kiršners – 2009 17
WHERE B.ID=A.ID ) AS PILSONISFROM ALGAS AWHERE A.FAKTISKA_ALGA=104.13
18. att. Vienpadsmitā vaicājuma realizācija
2.11.1. Relāciju algebras skaidrojums
vienpadsmitajam vaicājumam
Projekcija – apakšvaicājumā no tabulas PERSONAS tiek atlasīts atribūts UZVARDS;
Selekcija – apakšvaicājumā no tabulas ALGAS ar nosacījumu operatora WHERE
palīdzību, tiek atlasītas personas ar identifikatoru, kurām atbilst algas identifikators;
Projekcija – pamata vaicājumā no tabulas ALGAS laukiem, kuriem bija identifikatori
ar tabulu PERSONAS tiek atlasīti atribūti: UZVARDS;
Selekcija – pamata vaicājumā ar nosacījumu operatora WHERE palīdzību, tiek atlasīti
ieraksti ar vērtību 104,13.
2.12. Divpadsmitais vaicājums (pakārtots – HAVING)
Frāzē HAVING var izmantot parastos kā arī korelējošus vaicājumus. Korelējošos
apakšvaicājumos ārējām atsaucēm jāizmanto tikai tie ārējie vaicājuma elementi, kuri var tikt
izmantoti HAVING frāzē. HAVING frāzē var izmantot tikai agregātfunkcijas , kur par
argumentiem kalpo vaicājuma tabulu atribūtu nosaukumi, vai arī atribūtu nosaukumi, kas tiek
izmantoti GROUP BY frāzē. Ar vaicājuma palīdzību tiek izgūts to personu uzvārdi no
tabulām PERSONAS un ALGAS, ja šo tabulu identifikācijas lauki sakrīt, grupējot atlasītos
datus pēc uzvārda un aprēķinot faktiskās algas summu, tiks izvadītas personu uzvārdi, kuru
algu summas pārsniedz 1200. Vaicājuma realizācija ir attēlota 19. attēlā, savukārt vaicājuma
teksts ir sekojošs: SELECT B.UZVARDS FROM PERSONAS B, ALGAS AWHERE A.ID=B.IDGROUP BY B.UZVARDSHAVING SUM(A.FAKTISKA_ALGA) > 1200
19. att. Divpadsmitā vaicājuma rezultāts
DBVS-5 © Arnis Kiršners – 2009 18
2.13.
DBVS-5 © Arnis Kiršners – 2009 19
3. Izpildes
plāna iegūšana un analīze
Sākotnēji, lai realizētu izpildes plāna iegūšanu jāveic plānu tabulas PLAIN_TABLE
izveide. Šī tabula ir noklusējuma tabula, kurā ar EXPLAIN PLAN operatoru palīdzību ievieto
rakstus, kas apraksta SQL izteiksmju izpildes secību vaicājumu komandās: SELECT,
INSERT, UPDATE un DELETE, ko izmanto Oracle optimizētājs. Izpildes plāna
komponentes satur sekojošo:
tabulu, uz kuru atsaucas vaicājumi, to sistematizēšana;
pieejas metode, ko pielieto vaicājumā;
tabula, kas attēlo vaicājumu sasaites metodes.
Plāna tabulu iespējams realizēt divos veidos:
Izpildīt SQL skriptu UTLXPLAN.SQL, kas uzģenerē parauga plāna tabulu ar
nosaukumu PLAN_TABLE.
Izpildīt CREATE TABLE komandu ar sekojošu lauku definēšanu un datu tipiem tajā:CREATE TABLE PLAN_TABLE ( STATEMENT_ID VARCHAR2(30), PLAN_ID NUMBER, TIMESTAMP DATE, REMARKS VARCHAR2(4000), OPERATION VARCHAR2(30), OPTIONS VARCHAR2(255), OBJECT_NODE VARCHAR2(128), OBJECT_OWNER VARCHAR2(30), OBJECT_NAME VARCHAR2(30), OBJECT_ALIAS VARCHAR2(65), OBJECT_INSTANCE NUMERIC, OBJECT_TYPE VARCHAR2(30), OPTIMIZER VARCHAR2(255), SEARCH_COLUMNS NUMBER, ID NUMERIC, PARENT_ID NUMERIC, DEPTH NUMERIC, POSITION NUMERIC, COST NUMERIC, CARDINALITY NUMERIC, BYTES NUMERIC, OTHER_TAG VARCHAR2(255), PARTITION_START VARCHAR2(255), PARTITION_STOP VARCHAR2(255), PARTITION_ID NUMERIC, OTHER LONG, DISTRIBUTION VARCHAR2(30), CPU_COST NUMERIC, IO_COST NUMERIC, TEMP_SPACE NUMERIC, ACCESS_PREDICATES VARCHAR2(4000), FILTER_PREDICATES VARCHAR2(4000), PROJECTION VARCHAR2(4000), TIME NUMERIC,
DBVS-5 © Arnis Kiršners – 2009 20
QBLOCK_NAME VARCHAR2(30), OTHER_XML CLOB)
Parauga plāna tabulas atribūtu detalizētāks apraksts ir dots tabulā 1.1.
Plāna tabulas atribūtu apraksts1.1. tabula
Atribūta nosaukums Atribūta lauka skaidrojumsSTATEMENT_ID Vaicājuma identifikatorsPLAN_ID Plāna identifikatorsTIMESTAMP Plāna izpildes datums un laiksREMARKS Komentāri (līdz 4000 baitiem)OPERATION Izpildītās darbības nosaukums, vaicājuma izpildes solīOPTIONS Vaicājuma darbības vērtība
OBJECT_NODE Objekta atsauces nosaukums, kas tiek lietots, lai piekļūtu objektam (tabulas vai skata nosaukums)
OBJECT_OWNER Objekta īpašnieks, kas izveidojis shēmuOBJECT_NAME Objekta nosaukums OBJECT_ALIAS Objekta pieņēmumsOBJECT_INSTANCE Objekta pozīcijas numurs vaicājumāOBJECT_TYPE Objekta tipsOPTIMIZER Optimizētāja režīmsSEARCH_COLUMNS Atribūtu meklētājsID Plāna izpildes operācijas soļa identifikatorsPARENT_ID Nākošā plāna izpildes soļa identifikators, kas izmanto tekošā soļa rezultātuDEPTH Plāna izpildes dziļumsPOSITION Plāna izpildes kārtas numurs
COSTDarbības izmaksas, kas tiek vērtētas ar izmaksu bāzētu pieeju. Vaicājumiem, kas izmanto uz likumiem bāzētu pieeju šī lauka vērtība būs nulle (null). Izmaksas netiek noteiktas tabulu piekļuves darbībām
CARDINALITY Rindu skaits darbībai, ko vērtē ar izmaksu bāzētu pieejuBYTES Baitu skaits darbībai, ko vērtē ar izmaksu bāzētu pieejuOTHER_TAG Cita tipa specifiska informācija, kas varētu būt lietderīga lietotājam
PARTITION_START
Sākuma sadalījums, iespējamās lauka vērtības: n – SQL optimizātors ir identificējis sākuma sadalījumu; KEY – sākuma sadalījumu identificēs izpildes laikā; ROW LOCATION – sākuma sadalījumu identificēs izpildes
laikā, ieraksta vietu nosaka lietotājs, var izmantot globālo indeksu;
INVALID – sadalījuma diapazons ir tukšs.
PARTITION_STOP
Beigu sadalījums, iespējamās lauka vērtības: n – SQL optimizātors ir identificējis beigu sadalījumu; KEY – beigu sadalījumu identificēs izpildes laikā; ROW LOCATION – beigu sadalījumu identificēs izpildes
laikā, ieraksta vietu nosaka lietotājs, var izmantot globālo indeksu;
INVALID – sadalījuma diapazons ir tukšs.PARTITION_ID Solis, kas aprēķina sākuma un beigu sadalījuma laika pāra vērtībasOTHER Cita tipa specifiska informācija, kas varētu būt lietderīga lietotājamDISTRIBUTION SadaleCPU_COST Centrālā procesora (CPU) izmaksasIO_COST Diska datu ievades/izvades izmaksasTEMP_SPACE Brīvā telpa, izmanto hash - tabulu šķirošanaiACCESS_PREDICATES Piešķir izteiksmei, saīsinātus mainīgos (optimizē)
FILTER_PREDICATES Attēlo precīzus notikumus, kas un kāpēc notiek, kāpēc mainās procesora resursi, pat, ja plāna struktūra nemainās.
DBVS-5 © Arnis Kiršners – 2009 21
PROJECTION PlānošanaTIME Izpildes laiksQBLOCK_NAME Bloka nosaukumsOTHER_XML XML kods ar servisa informāciju
Ar komandu AUTOTRACE iegūst optimizētāja plāna atskaites. Šī komanda izvada
ekrānā SQL izpildes plāna atskaites par jebkuru ievadīto vaicājumu. Atskaites tiek veidotas
katram SQL vaicājumam, izmantojot komandas SELECT, DELETE, UPDATE un INSERT.
Komanda AUTOTRACE pieļauj sekojošus uzstādījumus:
SET AUTOTRACE OFF (pēc noklusējuma) – atslēdz atskaites ģenerēšanu ekrānā;
SET AUTOTRACE ON EXPLAIN – ieslēdz optimizācijas izpildes plāna rezultātus;
SET AUTOTRACE ON STATISTICS – ieslēdz vaicājuma un statistikas izpildes
plāna rezultātus;
SET AUTOTRACE ON - ieslēdz vaicājuma, statistikas un optimizētāja izpildes plāna
rezultātus;
SET AUTOTRACE TRACEONLY - ieslēdz statistikas un optimizētāja izpildes plāna
rezultātus;
SET AUTOTRACE TRACEONLY EXPLAIN - ieslēdz optimizētāja izpildes plāna
rezultātu.
Ar komandas EXPLAIN PLAN palīdzību, iespējams, izveidoto plāna struktūru, katram
vaicājumam, saglabāt tabulā PLAN_TABLE, tālākai iegūto rezultātu analīzei. Šīs komandas
sintakse ir sekojoša:
EXPLAIN PLAN SET STATEMENT_ID = ‘plāna (vaicājuma) nosaukums’ FOR
vaicājuma teksts
Izpildes plāna analīzei tiek izmantots standarta vaicājums, kas izvada izpildes plāna
informāciju ar sekojošiem atribūtiem: ID, OPERATION, NAME, ROWS, BYTES, Cost
(%CPU) un TIME, šo lauku atšifrējumi ir doti tabulā 1.1. Sākotnēji, tiek attēlots vaicājums,
tad vaicājuma rezultāts, izpildes plāns un plāna izpildes secības koks, kā arī dots skaidrojums
attiecīgajam vaicājumam.
3.1. Izpildes plāns pirmajam vaicājumam
Pirmā vaicājuma izpildes plāna rezultātus, skatīt 20. attēlu, vaicājums izpildes kods ir
sekojošs:SELECT VALSTS_KODS, VALSTS_NOS, PILSONIBAS_NOSFROM VALSTIS
Izpildes plāna darbību secība:
DBVS-5 © Arnis Kiršners – 2009 22
1. (1) TABLE ACCESS FULL – izgūst un apstrādā visus rakstus no tabulas
VALSTIS;
2. (0) SELECT STATEMENT – izvada ekrānā SELECT (projekcija – relāciju algebras
darbība) vaicājuma daļā norādītos atribūtus.
20. att. Izpildes plāns pirmajam vaicājumam
3.2. Izpildes plāns otrajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 21. attēlā.
21. att. Vaicājums, tā rezultāts un izpildes plāns otrajam vaicājumam
Izpildes plāna darbību secība:
1. (1) TABLE ACCESS FULL – izgūst un apstrādā visus rakstus no tabulas
PERSONAS, izmantojot filtru ar predikātu informāciju, jeb nosacījums, kuri atrodas
WHERE rindā;
2. (0) SELECT STATEMENT – izvada ekrānā SELECT (projekcija – relāciju algebras
darbība) vaicājuma daļā norādītos atribūtus.
DBVS-5 © Arnis Kiršners – 2009 23
3.3. Izpildes plāns trešajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 22. attēlā.
22. att. Vaicājums, tā rezultāts un izpildes plāns trešajam vaicājumam
Izpildes plāna soļus, skatīt 23. attēlā un darbību secība:
1. (2) TABLE ACCESS FULL – izgūst un
apstrādā visus rakstus no tabulas
PERSONAS, izmantojot filtru un piekļuvi
ar predikātu informāciju, jeb nosacījumi,
kas atrodas WHERE rindā (1);
2. (4) INDEX (UNIQUE SCAN) – atgriež
vērtību ROWID darbībai (3);
3. (3) TABLE ACCESS (BY INDEX
ROWID) - atgriež attiecīgos rakstus no
tabulas ALGAS darbībai (1);
4. (1) NESTED LOOPS – savieno rakstus, kas iegūti no darbībām (2) un (3) un nodod
tos darbībai (0);
5. (0) SELECT STATEMENT – izvada ekrānā saņemtos rakstus no apvienotajām
tabulām.
DBVS-5 © Arnis Kiršners – 2009
23. att. Trešā vaicājuma izpildes soļi
24
Vaicājumi, kuros ir vairāk par trīs soļiem tiek attēloti grafiski. Taisnstūri ar baltu iekrāsojumu,
norāda uz rakstiem, kas iegūti iepriekšējos soļos, bet pelēki – darbības, kas izgūs datus no
tabulām.
3.4. Izpildes plāns ceturtajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 24. attēlā.
24. att. Vaicājums, tā rezultāts un izpildes plāns ceturtajam vaicājumam
Izpildes plāna soļus, skatīt 25. attēlā un darbību secība:
1. (5) TABLE ACCESS FULL – izgūst un apstrādā visus rakstus no tabulas
PERSONAS, izmantojot filtru ar predikātu informāciju, jeb nosacījumi, kas atrodas
WHERE rindā (3);
2. (4) INDEX (FAST FULL SCAN) – atgriež vērtības HASH JOIN darbībai (3);
DBVS-5 © Arnis Kiršners – 2009 25
3. (3) HASH JOIN - savieno atlasītos rakstus no
tabulām PERSONAS un ALGAS darbībai (2);
4. (2) HASH (GROUP BY) – sagrupē rakstus,
darbībai (1);
5. (1) FILTER – atgriež tos rakstus, kas atbilst
šķirošanai iepriekšējā solī (0);
6. (0) SELECT STATEMENT – izvada ekrānā
saņemtos atlasītos rakstus.
3.5. Izpildes plāns piektajam
vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 26. attēlā.
26. att. Vaicājums, tā rezultāts un izpildes plāns piektajam vaicājumam
Izpildes plāna soļus, skatīt 27. attēlā un darbību secība:
DBVS-5 © Arnis Kiršners – 2009
25. att. Ceturtā vaicājuma izpildes soļi
26
1. (2) TABLE ACCESS FULL – izgūst un
apstrādā visus rakstus no tabulas
PERSONAS, izmantojot filtru un piekļuvi ar
predikātu informāciju, jeb nosacījumi, kas
atrodas WHERE rindā (1);
2. (5) INDEX (UNIQUE SCAN) – atgriež
vērtību ROWID darbībai (4);
3. (4) TABLE ACCESS (BY INDEX ROWID)
- atgriež attiecīgos rakstus no tabulas ALGAS
darbībai (3);
4. (3) FILTER – atgriež tos rakstus, kas atbilst
šķirošanai iepriekšējā solī (1);
5. (1) FILTER – atgriež tos rakstus, kas atbilst šķirošanai iepriekšējā solī (0);
6. (0) SELECT STATEMENT – izvada ekrānā saņemtos atlasītos rakstus.
3.6. Izpildes plāns sestajam vaicājumam
Šī vaicājuma izpildes plāna rezultātus, skatīt 28. attēlu, vaicājums izpildes kods ir
sekojošs:SELECT DECODE(GROUPING(B.TIPS), 1, 'VISI TIPI KOPA', UPPER(B.TIPS)) AS
TIPI, DECODE(GROUPING(A.VALSTS_KODS), 1, 'VALSTIS KOPA', UPPER(A.VALSTS_KODS)) AS "VALSTIS", COUNT(*) AS "TIPU SKAITS"
FROM VALSTIS A, PERSONAS BWHERE (A.VALSTS_KODS=B.VALSTS) GROUP BY CUBE (B.TIPS, A.VALSTS_KODS)
28. att. Izpildes plāns sestajam vaicājumam
DBVS-5 © Arnis Kiršners – 2009
27. att. Piektā vaicājuma izpildes soļi
27
Izpildes plāna soļus, skatīt 29. attēlā un darbību secība:
1. (6) TABLE ACCESS FULL – izgūst un
apstrādā visus rakstus no tabulas PERSONAS,
izmantojot filtru ar predikātu informāciju, jeb
nosacījumi, kas atrodas WHERE rindā (4);
2. (5) INDEX (FULL SCAN) – atgriež vērtības
HASH JOIN darbībai (4);
3. (4) HASH JOIN - savieno atlasītos rakstus no
tabulām PERSONAS un VALSTIS darbībai (3);
4. (3) SORT (GROUP BY) – kārto rakstus, grupās
ar parametru GROUP BY darbībai (2);
5. (2) GENERATE (CUBE) – katrā grupā tiek
veidoti jauni raksti, kas satur GROUP BY visas iespējamās atlasītās vērtības,
rezultāti tiek nodoti nākamajai darbībai (1);
6. (1) SORT (GROUP BY) – kārto rindas rakstus grupās, jo CUBE un GROUP BY
nodrošina kopējo vērību izvadi pa iespējamām grupām darbībai (0);
7. (0) SELECT STATEMENT – izvada ekrānā saņemtos atlasītos apvienotos rakstus.
3.7. Izpildes plāns septītajam vaicājumam
Šī vaicājuma izpildes plāna rezultātus, skatīt 30. attēlu, vaicājums izpildes kods ir:SELECT A.TIPS, B.FAKTISKA_ALGA, SUM(B.FAKTISKA_ALGA)OVER (PARTITION BY A.TIPS) "TIPAM KOPA"FROM PERSONAS A, ALGAS BWHERE (A.ID=B.ID) AND (B.SAKUMA_DATUMS=20010501)
30. att. Izpildes plāns septītajam vaicājumam
DBVS-5 © Arnis Kiršners – 2009
29. att. Sestā vaicājuma izpildes soļi
28
Izpildes plāna soļus, skatīt 31. attēlā un darbību secība:
1. (4) TABLE ACCESS FULL – izgūst un apstrādā
visus rakstus no tabulas PERSONAS,
izmantojot filtru ar predikātu informāciju, jeb
nosacījumi, kas atrodas WHERE rindā (2);
2. (3) TABLE ACCESS FULL – izgūst un apstrādā
visus rakstus no tabulas ALGAS, izmantojot
filtru ar predikātu informāciju, jeb nosacījumi,
kas atrodas WHERE rindā (2);
3. (2) HASH JOIN - savieno atlasītos rakstus no tabulām PERSONAS un ALGAS
darbībai (1);
4. (1) WINDOW (SORT) – atlasa rakstus, grupās ar parametru SORT darbībai (0);
5. (0) SELECT STATEMENT – izvada ekrānā saņemtos atlasītos apvienotos rakstus.
3.8. Izpildes plāns astotajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 32. attēlā
32. att. Vaicājums, tā rezultāts un izpildes plāns astotajam vaicājumam
DBVS-5 © Arnis Kiršners – 2009
31. att. Septītā vaicājuma izpildes soļi
29
Izpildes plāna soļus, skatīt 33. attēlā un darbību secība:
1. (4) TABLE ACCESS FULL –
izgūst un apstrādā visus rakstus no
tabulas PERSONAS, izmantojot
filtru ar predikātu informāciju, jeb
nosacījumi, kas atrodas WHERE
rindā (2);
2. (3) TABLE ACCESS FULL –
izgūst un apstrādā visus rakstus no
tabulas ALGAS, izmantojot filtru ar
predikātu informāciju, jeb nosacījumi, kas atrodas WHERE rindā (2);
3. (2) HASH JOIN - savieno atlasītos rakstus no tabulām PERSONAS un ALGAS
darbībai (1);
4. (1) WINDOW (SORT) – atlasa rakstus, grupās ar parametru SORT darbībai (0);
5. (0) SELECT STATEMENT – izvada ekrānā saņemtos atlasītos apvienotos rakstus.
3.9. Izpildes plāns devītajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 34. attēlā.
34. att. Vaicājums, tā rezultāts un izpildes plāns devītajam vaicājumam
DBVS-5 © Arnis Kiršners – 2009
33. att. Astotā vaicājuma izpildes soļi
30
Izpildes plāna soļus, skatīt 27. attēlā un darbību secība:
1. (4) TABLE ACCESS FULL – izgūst un
apstrādā visus rakstus no tabulas ALGAS,
nodod darbību (3);
2. (7) TABLE ACCESS FULL – izgūst un
apstrādā visus rakstus no tabulas ALGAS ,
nodod darbību (6);
3. (3) SORT (AGGREGATE) – raksti tiek
sakārtoti, izmantojot agregāciju un nodoti
darbībai (2);
4. (6) SORT (AGGREGATE) – raksti tiek
sakārtoti, izmantojot agregāciju un nodoti darbībai (5);
5. (2) VIEW – izveidots skats, ko nodod darbībai (1);
6. (5) VIEW – izveidots skats, ko nodod darbībai (1);
7. (1) NESTED LOOPS – savieno tabulu rakstus un nodod darbībai (0);
8. (0) SELECT STATEMENT – izvada ekrānā saņemtos atlasītos rakstus.
3.10. Izpildes plāns desmitajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 37. attēlā
Izpildes plāna soļus, skatīt 36. attēlā un darbību secība:
1. (2) TABLE ACCESS FULL – izgūst un apstrādā visus rakstus no tabulas ALGAS,
izmantojot filtru un piekļuvi ar predikātu informāciju, jeb nosacījumi, kas atrodas
WHERE rindā (1);
2. (5) BITMAP (INDEX RANGE SCAN) –
atgriež vērtību IND1 darbībai (4);
3. (4) BITMAP (CONVERSION TO ROWIDS) –
atgriež vērtību ROWIDS darbībai (3);
4. (3) TABLE ACCESS (BY INDEX ROWID) -
atgriež attiecīgos rakstus no tabulas
RERSONAS darbībai (1);
5. (1) HASH (JOIN) – savieno rakstus no divām
tabulām un atgriež rezultātu darbībai (0);
6. (0) SELECT STATEMENT – izvada ekrānā
saņemtos atlasītos rakstus.
DBVS-5 © Arnis Kiršners – 2009
35. att. Devītā vaicājuma izpildes soļi
36. att. Desmitā vaicājuma izpildes soļi
31
37. att. Vaicājums, tā rezultāts un izpildes plāns desmitajam vaicājumam
3.11. Izpildes plāns vienpadsmitajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 38. attēlā
Izpildes plāna darbību secība:
1. (1) TABLE ACCESS FULL – izgūst un apstrādā visus rakstus no tabulas
PERSONAS, izmantojot filtru ar predikātu informāciju, jeb nosacījums, kuri atrodas
WHERE rindā;
2. (1) TABLE ACCESS FULL – izgūst un apstrādā visus rakstus no tabulas ALGAS,
izmantojot filtru ar predikātu informāciju, jeb nosacījums, kuri atrodas WHERE
rindā;
3. (0) SELECT STATEMENT – izvada ekrānā SELECT (projekcija – relāciju algebras
darbība) vaicājuma daļā norādītos atribūtus.
DBVS-5 © Arnis Kiršners – 2009 32
38. att. Vaicājums, tā rezultāts un izpildes plāns vienpadsmitajam vaicājumam
3.12. Izpildes plāns divpadsmitajam vaicājumam
Šī vaicājuma teksts, vaicājuma rezultāts un izpildes plāna tabula attēlota 32. attēlā
39. att. Vaicājums, tā rezultāts un izpildes plāns divpadsmitajam vaicājumam
DBVS-5 © Arnis Kiršners – 2009 33
Izpildes plāna soļus, skatīt 40. attēlā un darbību
secība:
1. (4) TABLE ACCESS FULL – izgūst un
apstrādā visus rakstus no tabulas
ALGAS un nodod darbībai (3);
2. (4) TABLE ACCESS FULL – izgūst un
apstrādā visus rakstus no tabulas
PERSONAS un nodod darbībai (3);
3. (3) HASH JOIN - savieno atlasītos
rakstus no tabulām PERSONAS un
ALGAS darbībai (2);
4. (2) HASH (GROUP BY) – sagrupē
rakstus, darbībai (1);
5. (1) FILTER – atgriež tos rakstus, kas atbilst šķirošanai iepriekšējā solī darbībai (0);
6. (0) SELECT STATEMENT – izvada ekrānā saņemtos atlasītos rakstus.
DBVS-5 © Arnis Kiršners – 2009
40. att. Divpadsmitā vaicājuma izpildes soļi
34
4. Trīs
ieteikumu (HINTS) realizācija
Ar optimizētāja ieteikumu (Hints) palīdzību tiek realizēta SQL vaicājumu optimizācija,
mainot izpildes plāna izpildes soļus un nosacījumus. Datubāzu izstrādātājiem ir plašāks
priekšstats par savu izstrādāto datubāzi, tās struktūru, saitēm, datu tipiem un rakstu specifiku,
nekā to zina Oracle SQL koda optimizētājs. Tāpēc datubāzu izstrādātāji, ar ieteikumu
palīdzību, var realizēt daudz efektīvāku izpildes plānu secību, balstoties uz savām zināšanām.
Datubāzes administrējošais personāls ar ieteikumu palīdzību veido efektīvāku izpildes plāna
struktūru. Ieteikumus var izmantot, lai norādītu:
optimizācijas metodi SQL izteiksmei;
vaicājuma pieejas ceļu datu tabulai;
datu savienošanas kārtību savienošanas komandai;
datu savienošanas darbību savienošanas komandai.
Vaicājuma izpildes plāns tiek balstīts uz sekojošiem kritērijiem:
savienošanas kārtību;
savienošanas metodi;
pieejas metodi;
paralēlu procesu izpildi.
Veidojot ieteikumus SQL koda optimizācijai jāievēro sekojoši kritēriji pēc speciālistu
domām:
optimizācija jāveic tikai tad, kad citi līdzekļi ir neefektīvi vai nav devuši sagaidāmos
rezultātus;
ieteikumu veidošanas procesā ir jābūt ļoti uzmanīgiem, lai neizveidotu pretēju efektu,
kas radītu vaicājuma izpildes laika palielināšanos;
ieteikumu izmantošanas darbība ir vērsta uz vaicājuma iegūšanas veidu;
Oracle pieļauj tikai sintaktiski pareizi noformētus ieteikumus.
Ieteikumu izteiksmēm ir sekojoša sintakse:
{SELECT|INSERT|UPDATE|DELETE} /*+ieteikums [teksts] ieteikums [teksts] … */ , kur
SELECT, INSERT, UPDATE, DELETE – atslēgas vārdi, ar kuriem sākas vaicājums;
/* … */ - komentārs ar norādi;
+ - komentārs jāinterpretē ieteikumu sarakstam;
ieteikums – komentārs, kas tiek interpretēts kā ieteikums, vairākus ieteikumus
vaicājumā atdala no pārējiem ieteikumiem ar tukšumu;
DBVS-5 © Arnis Kiršners – 2009 35
teksts – komentārs (paskaidrojošs teksts), ko pievieno ieteikumam.
4.1. Pirmā ieteikuma realizācija
Sākotnēji tiek izmantota optimizācijas metode /* CHOOSE */, pielietota tā tiek gandrīz
visiem vaicājumiem, bet acīm redzamu efektu šī metode nedod nevienam no divpadsmit
vaicājumiem. Tāpēc sīkāk par šo optimizācijas metodi vairāk netiek diskutēts, vismaz šī
uzdevuma ietvaros un izveidotajiem vaicājumiem.
Aplūkojot citu metodi, tādu /* FIRST_ROWS(n) */, kur parametrs n norāda vaicājumā
izmantojamo indeksu skaitu. Pielietojot indeksus vaicājumā ir iespējams paātrināt vaicājuma
izpildes laiku un samazināt vaicājuma izpildes izmaksas. Šī vaicājuma ietvaros optimizētājam
būtu efektīvi ieteikt izmantot indeksus, jo rezultāts jāiegūst pēc iespējas ātrāk, bet indeksa
izvēle paliek paša optimizētāja rokās, kas pats atrod piemērotāko no izveidotajiem indeksiem.
Vaicājuma rezultātu bez ieteikuma ar indeksiem, skatīt 41. attēlā.
41. att. Vaicājuma rezultāts bez ieteikuma izmantošanas
Modificējot vaicājumu un iekļaujot tajā ieteikumu, vaicājums ir sekojošs:
SELECT /*+ FIRST_ROWS(5) */ A.VARDS, A.UZVARDSFROM PERSONAS A, ALGAS BWHERE ((A.ID=B.ID) AND (A.VARDS='JANIS'))GROUP BY A.VARDS, A.UZVARDSHAVING COUNT(A.VARDS) > 3
Vaicājuma izpildes rezultātā, skatīt 42. attēlu, iegūst procesora noslodzes izmaksu
samazinājumu visos izpildes plāna soļos, kā arī samazinās apstrādāto baitu skaits katrā
izpildes plāna norises solī. Izmantojot ieteikumā izmantotos indeksus, panākts arī apstrādāto
rakstu skaita samazinājums. Kaut gan laika ieguvums nav novērojams, tas varētu būt
skaidrojams ar samērā nelielo rakstu skaita izmantošanu šī vaicājuma ietvaros. Iespējams, ja
DBVS-5 © Arnis Kiršners – 2009 36
vaicājuma izmantoto rakstu skaits būtu lielāks, varētu novērot arī vaicājuma izpildes laika
samazinājumu.
42. att. . Vaicājuma rezultāts ar ieteikuma izmantošanu
4.2. Otrā ieteikuma realizācija
Šī ieteikuma ietvaros tiks mēģināts uzlabot vaicājumu, kura izpildes plāna rezultāti ir
DBVS-5 © Arnis Kiršners – 2009 37
43. att. Vaicājuma rezultāts bez ieteikuma izmantošanas
redzami 43. attēlā. Uzlabotā vaicājuma teksts, vaicājumu izpilde un izpildes plāns attēloti 44.
attēlā. Šī vaicājuma ietvaros, izmantosim /*+ ORDER */ tipa ieteikuma metodi, kura norāda
tabulas pieejas secību, tādā pat veidā kā tiek formētas SQL vaicājumi FROM daļā.
Pievienosim vēl vienu ieteikuma metodi /*+ USE_NL (tabula1 tabula2) */, kas realizē
salīdzinājumu darbību .izmaksām ar tabulu apvienošanas metodi NESTED LOOPS.
Apvienojam abus ieteikumus vienā /*+ ORDER USE_NL (tabula1 tabula2) */ un izpildām
44. att. Vaicājuma rezultāts ar ieteikuma izmantošanu
DBVS-5 © Arnis Kiršners – 2009 38
vaicājumu. Vaicājuma izpildes rezultātā iegūst savādāku izpildes plāna secību, bet savukārt
iegūtie uzlabojumu ir pavisam minimāli. Nedaudz uzlabotas procesora noslodzes izmaksas,
samazināti apstrādāto rakstu skaits, kas pilnīgi neietekmē vaicājuma izpildes kopējo laiku. Arī
šī vaicājuma optimizācija nav devusi kardinālus uzlabojumus, atliek vienīgi secināt, ka
optimizācijas procesa automatizācija, t.n. metodes, ko izvēlas rīks ir efektīvas un neprasa
administratora vai eksperta iejaukšanos dotā procesa optimizācijā.
DBVS-5 © Arnis Kiršners – 2009 39
4.3. Trešā ieteikuma realizācija
Šī ieteikuma realizācijas ietvaros aplūkosim vaicājumu, kuram jau pats optimizātors ir
izveidojis ieteikumu tā izpildes procesā. Vaicājumu, tā izvades rezultātus un izpildes plānu,
skatīt 45. attēlā. Tad no izpildes plāna ir redzams, ka optimizātors SELECT apakšvaicājumā ir
ievietojis ieteikumu, tādā veidā nodrošinot automātisku ieteikumu izveidi.
45. att. Vaicājums, tā izpildes rezultāts un izpildes plāns
Optimizēsim doto vaicājumu, iekļaujot tajā /*+ ALL_ROWS */ ieteikumu, kas optimizē
sistēmas darbu ar labāko caurlaides mērķi. Veicot šo uzlabojumu, rezultātā izpildes plāna
secībā izmaiņas netika novērotas. Pavisam minimāli ir samazinājušas procesora noslodzes
izmaksas, apstrādāto baitu un rakstu skaits. Rezultātā kardināls ieguvums netika sasniegts.
Ieteikumu izpildes rezultātus var aplūkot 46. un 47. attēlos.
46. att. Ieteikuma realizācijas attēlojums no Toad 8.5 videsDBVS-5 © Arnis Kiršners – 2009 40
47. att. Vaicājums, tā izpildes rezultāts un izpildes plāns
DBVS-5 © Arnis Kiršners – 2009 41
5. Secināju
mi
Šis darbs tika realizēts izmantojot Windows Vista 32-bit operētājsistēmu un Oracle
Database 10.2.0.3.0 Enterprice Edition datubāzu vadības sistēmu (DBVS), kas paredzēta tieši
šai operētājsistēmai. Šīs lietas nākas pieminēt, jo attiecīgajā operētājsistēmā un DBVS veicot
SQL optimizāciju, tā atšķiras no DBVS versijām (8i, 9i un 10.1.0.0g), kas tika aplūkotas
lekciju gaitā un izdales materiālos. Sākot no 10.1g versijas tika pārstrādāta PLAN_TABLE
noklusējuma tabula, tajā tika pievienoti jauni atribūtu lauki. Optimizātora parametros vairs
nav iespējams iestādīt optimizētāja vērtības: CHOOSE, FIRST_ROWS, ALL_ROWS un
RULE. Tās tiek iestādītas automātiski vaicājuma analīzes procesā, kur optimizātors izvēlas
piemērotāko variantu. Tāpat tiek nerekomendēts izmantot uz likumiem balstītu optimizāciju
(rule base optimization, RBO), jo tās uzturēšana vairs netiek atbalstīta, sākot no 10g versijas.
Sākot no versijas 10.2g realizēta ir hash (GROUP BY) funkciju izpilde un iespēja izgūt
sistēmas statistiku ar trasēšanas datnes 10053 palīdzību, kas ieslēdz sistēmas statistikas
sadaļu.
Datu bāzes transformācija no MS Access 2007 vides uz Oracle vidi noritēja bez
problēmām, ja nu vienīgi tabulas PERSONAS transformēšanas laiks ieilga, tās apjoma dēļ.
Vaicājumu izveide un realizācija sākotnēji tika veikta Toad 8.5 vidē, bet tā kā šis rīks neuztur
SQL optimizātora 10.2g versijas plāna tabulas attēlojumu automātiskā režīmā, tikai ierakstot
datus PLAIN_TABLE ar EXPLAIN PLAN SET, tad rezultātu attēlošanai izmantoju veco
labo SQL*Plus, lai ekonomētu savu laiku.
Analizējot izpildes plāna secību, vaicājumiem, kuru izpildes soļu secība bija lielāka par
četri, tika veikts arī grafisks to attēlojums, jo darba autors uzskata, ka tādā veidā ir
uzskatamāk izprast vaicājumā notiekošos procesus.
Šī darba ietvaros nācās diezgan aktīvi padarboties ar literatūru, kas šai Oracle versijai
(10.2.0.3.0), tieši ieteikumu optimizācijas jomā ir diezgan skopa. Kā jau tika minēts iepriekš ir
veikta virkne uzlabojumu, lai jaunajos Oracle produktos atvieglotu administratoru «dzīvi»,
vaicājumu optimizācijas process ir piedzīvojis lielu automatizāciju, salīdzinot ar iepriekšējām
Oracle versijām (8i, 9i un 10.1i).
Veicot neskaitāmus vaicājumus ar dažādām optimizācijas metodēm tajos, no kuriem trīs
ieteikumi ir izklāstīti darba gaitā, daba autors tā arī nespēja atrast efektīvu ieteikuma metodi,
kas kardināli uzlabotu vaicājuma efektivitātes izpildi. Iegūtos uzlabojumus var uzskatīt par
DBVS-5 © Arnis Kiršners – 2009 42
neefektīviem, jo laika patēriņš, tos izstrādājot cilvēkam, ir daudzas reizes lielāks, kā doto
procesu uzdot izpildīt pašam vaicājumam (datoram).
Var tikai secināt, ka jaunākajās Oracle versijās iebūvētais vaicājumu optimizātors strādā
diezgan efektīvi. Cenšoties izveidot kardināli labāku ieteikumu, darba autoram tā arī tas
neizdevās, tas vedina uz domu vai optimizātors strādā efektīvi un risina vaicājumu
optimizācijas uzdevumus, vai arī darbā aplūkotie vaicājumi bija diezgan viegli uztverami
optimizētājam, kā rezultātā vaicājumi tika izpildīti tā optimālākajā veidā.
Aplūkojot lekciju gaitā izklāstīto materiālu un iepriekšējo gadu kolēģu veikumu, rodas
iespaids, ka Oracle izstrādātāji ir spēruši diezgan ievērojamus soļus vaicājumu optimizācijas
laukā, kas protams ir apsveicami, bet varbūt darba autoram rodas maldīgs iespaids. Šāds darba
iznākums ir radies tāpēc, ka vaicājumu sintakse ir veidota pēc pareiziem principiem, kas
optimizētājam nerada liekas problēmas, bet par to varēs spriest pēc vairāku kolēģu paveiktiem
darba rezultātiem, darbojoties ar Oracle versiju 10.2.3.0g vai jaunāku.
DBVS-5 © Arnis Kiršners – 2009 43
Izmantotās literatūras saraksts
1. Prof. Jānis Eiduks «Lekciju konspekti» - 2009
2. J. Perry, G.Post «Introduction to Oracle 10g» - 2006, Pearson Prentice Hall, 698 p.
3. Scoot Urman, Ron Hardman, Michael McLaughlin «Oracle Database 10g PL/SQL
Programming» - 2004, Oracle press, 792 p.
4. Narayan S. Umanath, Richard W. Scamell «Data modeling and database design» -
2007, Thomson course tehnology, 698 p.
5. Teorey T., Lightstone S., Nadeau T. Database modeling and design – 2006, Morgan
Kaufmann Publisher, 275 p.
6. Льюис Дж. «Oracle Основы стоимостной оптимизации» - 2007, Питер, 527 с.
DBVS-5 © Arnis Kiršners – 2009 44