Kodulehed
[387] - Andmebaasid II (ITI0207) (sügis 2024)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid.
Värvilised mummud tähistavad hinnangulist kataloogide lugemise vajadust. Roheline - suurim, kollane - keskmine, punane või mummuta - väikseim
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / Andmebaasisüsteemid (Üldine)

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Anonüümne (01.03.2025 09:41):
Kuidas andmebaasisüsteemid andmebaasiserveris talletatud rutiine täidavad?
Vastus (02.03.2025 13:04): Erinevates andmebaasisüsteemides käib see erinevalt.

PostgreSQLis saab rutiinide kirjutamiseks kasutada lisaks C ja SQL keeltele veel keeli. Neid teisi keeli nimetatakse protseduurilisteks keelteks (PL). Kõige populaarsem nendest on PL/pgSQL.
Protseduurilises keeles kirjutatud rutiini korral ei ole andmebaasisüsteemil sisseehitatud teadmisi kuidas tuleks rutiini lähtekoodi tõlgendada. Selle asemel antakse ülesanne üle spetsiaalsele käsitlejale (handler), mis tunneb selle keele üksikasju. Käsitleja võib ise teha kogu töö, sealhulgas sõelumise, süntaksianalüüsi, täitmise jne, või toimida "liimina" PostgreSQL-i ja olemasoleva programmeerimiskeele realisatsiooni vahel. Käsitleja ise on C-keeles kirjutatud funktsioon, mis on kompileeritud jagatud objektiks ja laaditakse nõudmisel, nagu iga teine C-funktsioon.

Huvitaval kombel ei ole PL/pgSQL keeles kirjutatud protseduuride sisemisest täitmisest palju avalikku seletavat informatsiooni (lähtekood on avalik ja seda võib iga soovija uurida). PostgreSQLi dokumendis kirjutati sellest kuni versiooni 8.2 dokumentatsioonini.

Andmebaasi süsteemikataloogis (andmebaasi alamosas, mis sisaldab infot andmebaasi kohta) on rutiinide lähtekood. PL/pgSQL-i käsitleja sõelub rutiini andmebaasi kasutamise seansi jooksul esmakordsel väljakutsumisel rutiini lähtekoodi ja loob kahendformaadis puustruktuuri (binary instruction tree). Selles puustruktuuris on PL/pgSQL-i laused tõlgitud, kuid rutiinis kasutatavaid SQL avaldisi ja -lauseid kohe ei tõlgita. Sellise puustruktuuri loomist nimetatakse kompileerimiseks.
 
Kui PL/pgSQL-rutiini täitmisel kasutatakse esmakordselt mingit SQL-avaldist või -lauset, siis loob PL/pgSQL töötleja sellel ettevalmistatud täitmisplaani. Järgnevad sama avaldise või lause kasutuskorrad selle seansi jooksul taaskasutavad seda ettevalmistatud plaani. Seega, kui rutiin sisaldab tingimuslikku koodi, milles on palju lauseid, mille jaoks võib olla vaja täitmisplaane, siis luuakse ja salvestatakse ainult need plaanid, mida tegelikult seansi jooksul kasutatakse. See võib oluliselt vähendada aega, mis kulub PL/pgSQL-rutiinis kasutatavate lausete sõelumiseks ja täitmisplaanide loomiseks. Puuduseks on see, et konkreetse avaldise või lause vead avastatakse alles siis, kui täitmine jõuab selle rutiini osani.
 
Loodud täitmisplaani konkreetse avaldise või lause jaoks rutiinis kasutatakse kogu andmebaasiühenduse vältel. Tavaliselt parandab see jõudlust, kuid võib tekitada probleeme, kui andmebaasi skeemi vahepeal muuta. Näiteks kui rutiinis A kutsutakse välja protseduur B, mis vahepeal kustutatakse ja ja uuesti luuakse, siis A uue väljakutsel B-d ei leita, sest B unikaalne identifikaator (OID) on muutunud. Sellisel juhul tuleks A uuesti luua või vähemalt alustada uut andmebaasi kasutamise seanssi, et see uuesti kompileeritaks. Üks võimalus selle probleemi vältimiseks on kasutada B muutmiseks CREATE OR REPLACE lauset, kuna rutiini "asendamisel" selle OID ei muutu.
 
Kuna PL/pgSQL kasutamise korral salvestatakse täitmisplaane sellisel viisil, peavad PL/pgSQL-rutiinis otse esitatud laused ja avaldised viitama igal täitmisel samadele tabelitele ja veergudele. See tähendab, et laused ja avaldised ei saa kasutada tabeli või veeru nime määramiseks parameetrit. Selle piirangu ületamiseks võib kasutada SQL lausete koostamist ning EXECUTE lause abil käivitamist. Samas toob see iga täitmise korral kaasa uue täitmisplaani loomise.

Oracles saab valida, kuidas rutiine kompileerida. Vaikimisi lähenemine on interpreteerimine (interpreted). See tähendab, et rutiini kood tõlgitakse rutiini loomisel kõrgkeelest baitkoodi (p-code). Selline osaliselt kompileeritud kood salvestatakse andmebaasi süsteemikataloogi. Täitmisel loeb PL/SQL interpretaator baitkoodi, interpreteerib seda ja täidab käsud. 

Alates Oracle9i on võimalik ka tõlkimine C keelde ja kompileerimine (native). See tähendab, et kood tõlgitakse C keelde (ka Oracle on kirjutatud C-s), kompileeritakse ning luuakse jagatud teegifail, mis sisaldab programmi objektkoodi. Süsteemikataloogis salvestatakse objektkood. Sellisel viisil kompileerimine rakendub ainult rutiinis olevatele PL/SQL lausetele (mitte SQLile). Seetõttu parandab selline lähenemine töökiirust, kui rutiinis on palju tegevusi, mis pole seotud SQL lausete käivitamisega. Rutiini käivitamisel loetakse kompileeritud kood muutmällu ning muutmälus on rutiinist ainult üks koopia.

Mõlemal juhul on süsteemikataloogis ka lähtekood.

ALTER SESSION SET PLSQL_CODE_TYPE='NATIVE';

CREATE OR REPLACE PROCEDURE test_pr ...

ALTER SESSION SET PLSQL_CODE_TYPE='INTERPRETED';

ALTER PROCEDURE test_pr COMPILE;
 
 

Hinda vastust:

Keskmine hinne : Pole veel hinnanguid!