RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewkalpo kopējā, minimālā un maksimālā elektroenerģijas...
Transcript of RĪGAS TEHNISKĀ UNIVERSITĀTE - Web viewkalpo kopējā, minimālā un maksimālā elektroenerģijas...
Objekta tipu projektēšanaObjekta paraugs (reģioni, elektrības patēriņa vērtības)
2
Objekta tipu definēšana
Tiek definēts kolekciju tips reģionu vērtību
glabāšanai.
Masīvs reģionu vērtību glabāšanai
create or replace type T_REGIONU_VERTIBAS as varray(25) of number;
Objektu tips reģionu vērtību glabāšanai, kas papildus satur:
1) ieraksta laiku;
2) minimālās elektroenerģijas patēriņa vērtības;
3) maksimālās elektroenerģijas patēriņa vērtības;
4) kopējās elektroenerģijas patēriņa vērtības;
5) metodi to noteikšanai (APR_PIEPRAS).
create or replace type T_ENERGO_PIEPRAS as object (
KOP_PIEPRAS number,
MIN_PIEPRAS number,
MAX_PIEPRAS number,
REGIONU_VERTIBAS T_REGIONU_VERTIBAS,
LAIKS date,
MEMBER procedure APR_PIEPRAS);
3
Metode APR_PIEPRAS
Metode APR_PIEPRAS kalpo kopējā, minimālā un maksimālā elektroenerģijas
patēriņa aprēķināšanai un saglabāšanai atribūtos. Algoritms iziet cauri visām
kolekcijas vērtībām, un izskaitļo to summu, kā arī atrod minimālo un maksimālo
vērtības. Objektu tipa ķermeņa izveidošana:
create or replace type body T_ENERGO_PIEPRAS as
MEMBER procedure APR_PIEPRAS is
i number;
kop number;
minv number;
maxv number;
BEGIN
kop := 0;
minv := REGIONU_VERTIBAS(REGIONU_VERTIBAS.FIRST);
maxv := REGIONU_VERTIBAS(REGIONU_VERTIBAS.FIRST);
for i in REGIONU_VERTIBAS.FIRST .. REGIONU_VERTIBAS.LAST LOOP
kop := kop + REGIONU_VERTIBAS(i);
if minv > REGIONU_VERTIBAS(i) then minv :=
REGIONU_VERTIBAS(i);
end if;
if maxv < REGIONU_VERTIBAS(i) then maxv :=
REGIONU_VERTIBAS(i);
end if;
end loop;
KOP_PIEPRAS := kop;
MIN_PIEPRAS := minv;
MAX_PIEPRAS := maxv;
end; end;
4
Datu glabāšanas tabula ENERGO_TABULA
create table ENERGO_TABULA (
ID number Primary key,
PARAUGS T_ENERGO_PIEPRAS);
-- Datu ievade
DECLARE
EN T_ENERGO_PIEPRAS;
BEGIN
EN := T_ENERGO_PIEPRAS(NULL, NULL, NULL,
T_REGIONU_VERTIBAS( 5, 7,12, 7, 4, 6,10,13, 8, 5, 9,14,12, 9, 6, 8, 9,11,10, 7,
6, 7,10, 9, 5),
TO_DATE('01-01-2006 01','MM-DD-YYYY HH') );
EN.APR_PIEPRAS;
INSERT INTO ENERGO_TABULA VALUES (1, EN);
END;
5
Ievadīto datu apskate
select a.*
from ENERGO_TABULA a;
6
Indeksēšanai nepieciešamās izveidoto objektu apstrādes funkcijas
Funkcija Patiesumvērtība
ENERGO_VIENADS (paraugs, 1, 5) = 1 Patiess, jo 1. reģiona vērtība ir 5
ENERGO_LIELAKS (paraugs, 2, 8) = 0 Patiess, jo 2. reģiona vērtība nav lielāka par 8
ENERGO_VIENADS_JEBK (paraugs, 3) = 1 Aplams, jo neviena no vērtībām nav vienāda ar 3
ENERGO_LIELAKS_JEKB (paraugs, 13) = 1 Patiess, jo 12. reģiona vērtība tik tiešām ir lielāka par 13
ENERGO_MAZAKS_JEBK (paraugs, 6) = 0 Aplams, jo vairākas vērtības ir mazākas par 6
Indeksa veidošanai jāizmanto operatori. Līdz ar to sākumā ir jāizveido
attiecīgās funkcijas, un pēc tam ar noteiktu komandu palīdzību
jāpiesaista operatoriem.
7
Funkciju izveidošana
Funkcija F_ENERGO_VIENADS, kas kā parametrus pieņem attiecīgā objektu tipa
eksemplāru (kas satur reģionu vērtību kolekciju), reģiona numuru un vērtību, ar kuru
funkcija veic salīdzināšanu. Funkcija pārbauda, vai norādītā reģiona indekss
nepārsniedz masīva pēdējo indeksu, un salīdzina argumentos sniegto vērtību ar
attiecīgā reģiona ierakstīto vērtību objektu tipa eksemplārā. Ja vērtības ir vienādas,
tad funkcija atgriež vērtību „1” (patiess), pretējā gadījumā – „0” (aplams).
-- Vai enerģijas patēriņa vērtība ir vienāda ar objekta konkrētā reģiona patēriņu?
CREATE FUNCTION F_ENERGO_VIENADS (OBJ T_ENERGO_PIEPRAS,
REGIONS NUMBER, VERTIBA NUMBER) RETURN NUMBER AS
BEGIN
IF REGIONS <= OBJ.REGIONU_VERTIBAS.LAST THEN
IF (OBJ.REGIONU_VERTIBAS(REGIONS) = VERTIBA) THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
ELSE
RETURN NULL; -- ārpus robežām
END IF;
END;
Funkciju nosaukumi, kas ir analogi attiecīgo operatoru nosaukumiem,
sākās ar priedēkli „F_”. Funkciju argumentu vērtībām jāsakrīt ar
operatora argumentiem.
8
Lietotāju definēti operatoru izmantošana indeksēšanai
Operatori ir augsta līmeņa shēmas elementi. To realizācija ir ļoti cieši sasaistīta ar paplašināmo indeksēšanu. Ja noteikts operators, kas ir piesaistīts problēmsfēras indeksa tipam, ir sastopams vaicājuma WHERE daļā, tad indeksācijas mehānisms, balstoties uz operatora predikātu informāciju, var optimizēt vaicājumu un iedarbināt indeksēšanas mehānismu. Neveicot pilnu tabulas skenēšanu, bet gan analizējot indeksa struktūru – indeksam tiks nodota visa informācija par operatora predikāta izteiksmi. Uz tā bāzes tad arī notiks attiecīgās darbības pamattabulas rindiņu izgūšanai.Lietotāju definēti operatori tiek piesaistīti noteiktai funkcijai, kura kā pirmo parametru noteikti satur objektu tipu, kuram šis operators tiek piemērots.Sākumā tiek izveidotas attiecīgās funkcijas, un tad operatori – ar CREATE OPERATOR palīdzību. Praktiskajā daļā tiks apskatīti operatoru izveide un indeksa tipa izveide problēmsfēras objektu tipa indeksēšanai.
create function SALIDZIN (a VARCHAR2, b VARCHAR2) RETURN NUMBER ASBEGIN IF a = b THEN RETURN 1; ELSE RETURN 0; END IF;END;
create operator SAL BINDING (VARCHAR2, VARCHAR2) RETURN NUMBER USING SALIDZIN;
Operators are often defined in connection with indextypes. After creating the operators with their functional implementations, you can create an indextype that supports evaluations of these operators using an index scan.
9
Operatoru piesaiste funkcijām
Kad funkcijas ir izveidotas, tās var piesaistīt operatoriem. Operatoru izveide Oracle
notiek ar komandas CREATE OPERATOR palīdzību, kur operatora nosaukumam
norāda parametru kopu un atgriežamo vērtību, un, svarīgākais – izmantojamo
funkciju. Operatoru izveide:
create operator ENERGO_VIENADS binding (T_ENERGO_PIEPRAS, NUMBER, NUMBER) return number USING F_ENERGO_VIENADS;
create operator ENERGO_LIELAKS binding (T_ENERGO_PIEPRAS, NUMBER, NUMBER) return number USING F_ENERGO_LIELAKS;
create operator ENERGO_MAZAKS binding (T_ENERGO_PIEPRAS, NUMBER, NUMBER) return number USING F_ENERGO_MAZAKS;
create operator ENERGO_VIENADS_JEBK binding (T_ENERGO_PIEPRAS, NUMBER)return number USING F_ENERGO_VIENADS_JEBK;
create operator ENERGO_LIELAKS_JEBK binding (T_ENERGO_PIEPRAS, NUMBER)return number USING F_ENERGO_LIELAKS_JEBK;
create operator ENERGO_MAZAKS_JEBK binding (T_ENERGO_PIEPRAS, NUMBER) return number USING F_ENERGO_MAZAKS_JEBK;
select a.ID
from ENERGO_TABULA a
where ENERGO_VIENADS(a. PARAUGS, 2, 7) = 1;
2 reģions, vērtība = 7
10
Objektu kolonnas indeksēšanas princips
Attēlā redzams, kā pirmās trīs kolekcijas vērtības nonāk indeksa tabulā. Katrai vērtībai tiek norādīta:
1) attiecīga pozīcija kolekcijā (RPOZ);2) vērtība (RVERT);3) rindiņas identifikācijas numurs (RID).
11
Oracle Data Cartridge Interface (ODCI) metodes
Interfeisa metode Apraksts
ODCIGetInterfaces Atgriež interfeisa versiju realizējamajam indeksam („ODCIINDEX2” gadījumā, ja izmanto jaunākas Oracle 9i iespējas, pretējā gadījumā „ODCIINDEX1”).
ODCIIndexCreate Izveido tabulu, kur tiek glabāti indeksējamie dati, tiek izsaukta indeksa izveides laikā. Jāparedz gadījumi, kad pamattabula nav tukša.
ODCIIndexDrop Izdzēš tabulu ar indeksējamajiem datiem. Tiek izsaukta DROP INDEX vai pamattabulas dzēšanas gadījumā.
ODCIIndexAlter Atjauno indeksa tabulu, balstoties uz izmainītajiem indeksa parametriem. Tiek izsaukta ALTER INDEX gadījumā.
ODCIIndexStart Inicializē indeksa skenēšanu iepriekšdefinētam un ar indeksa tipu sasaistītam operatoram. Definē kursoru vaicājumam, kas tiek konstruēts uz operatora bāzes (gadījumā, kad vaicājumā parādās operatori, kuri var tikt analizēti ar indeksa palīdzību).
ODCIIndexFetch Atgriež ROWID katrai rindiņai, kura apmierina operatora predikātu, t.i., ar indeksa palīdzību izgūstam nepieciešamās rindiņas.
ODCIIndexClose Beidz vaicājuma izpildi, aizver kursoru.ODCIIndexInsert Maina indeksa struktūru gadījumā, kad pamattabulā tiek
ievietoti dati.
ODCIIndexDelete Maina indeksa struktūru gadījumā, kad no pamattabulas tiek izdzēsti dati.
ODCIIndexUpdate Maina indeksa struktūru gadījumā, kad pamattabulā tiek atjaunoti dati.
ODCIIndexGetMetadata
Dod iespēju eksportēt un importēt ar indeksu realizāciju saistītus metadatus.
12
Objekta tips indeksa tipam
1. Pirms tiek izveidots indeksa tips, tam ir jādefinē objekta tips.
2. Tas saturēs svarīgākās interfeisa metodes, kuras ir nepieciešamas
indeksēšanas mehānisma darbībai. Dažas no tām ir realizētas kā STATIC,
dažas kā MEMBER – tas ir atkarīgs no funkcijas specifikācijas.
3. MEMBER funkcijas tiek izpildītas konkrētam eksemplāram, tām ir
piekļuve visiem objektu tipa argumentiem.
4. Savukārt STATIC funkcija var tikt izsaukta pat tad, ja nav izveidots
objektu tipa eksemplārs.
Objektu tips satur vienu papildus mainīgo – KURSORS (NUMBER tipa
atribūts). Šis kursors tiks izmantots, lai varētu veikt problēmsfēras indeksa
skenēšanu.
Ar paketes DBMS_SQL palīdzību kursors tiks saistīts ar dinamiski
izveidotu vaicājumu, un šis kursors tiks izmantots metodēs, kas atbild
par datu izgūšanu no indeksa tabulas.
13
Indeksa objekta tipa definējums (specifikācija)
create or replace type T_ENERGO_INDEKSS as object (
KURSORS number,
static function ODCIGetInterfaces (IFCLIST OUT
SYS.ODCIOBJECTLIST) return number,
static function ODCIIndexCreate (SYS.ODCIINDEXINFO, PARMS VARCHAR2,
ENV SYS.ODCIENV) RETURN NUMBER,
static function ODCIINDEXDROP(IA SYS.ODCIINDEXINFO,
ENV SYS.ODCIENV) RETURN NUMBER ,
static function ODCIINDEXSTART(SCTX IN OUT T_ENERGO_INDEKSS,
IA SYS.ODCIINDEXINFO, OP SYS.ODCIPREDINFO, QI
SYS.ODCIQUERYINFO, STRT NUMBER, STOP NUMBER, SALPOZ
NUMBER, SALVERT NUMBER, ENV SYS.ODCIENV) return number,
static function ODCIINDEXSTART(SCTX IN OUT T_ENERGO_INDEKSS,
IA SYS.ODCIINDEXINFO, OP SYS.ODCIPREDINFO, QI
SYS.ODCIQUERYINFO, STRT NUMBER, STOP NUMBER, SALVERT
NUMBER, ENV SYS.ODCIENV) return number,
MEMBER function ODCIINDEXFETCH(NROWS NUMBER,
RIDS OUT SYS.ODCIRIDLIST, ENV SYS.ODCIENV) return number,
MEMBER FUNCTION ODCIINDEXCLOSE(ENV SYS.ODCIENV) return
number,
static function ODCIINDEXINSERT(IA SYS.ODCIINDEXINFO, RID
VARCHAR2, JAUNA_V T_ENERGO_PIEPRAS, ENV SYS.ODCIENV) return
number,
static function ODCIINDEXDELETE(IA SYS.ODCIINDEXINFO, RID
VARCHAR2, VECA_V T_ENERGO_PIEPRAS, ENV SYS.ODCIENV) return
number,
static function ODCIINDEXUPDATE(IA SYS.ODCIINDEXINFO, RID
14
VARCHAR2, VECA_V T_ENERGO_PIEPRAS, JAUNA_V
T_ENERGO_PIEPRAS, ENV SYS.ODCIENV) return number);
15
Oracle Spatial grafisko datu apstrādes kodola paplašinājuma problēmsfēras indekss
Vviens no telpisko indeksu veidiem ir R-koka indekss. Šī indeksa darbības princips ir katras ģeometrijas aproksimācija ar tās mazāko ierobežojuma taisnstūri. Tādā veidā tiek aptverta visu ģeometriju kopa, un izveidots tādu taisnstūru koks.
16
Indeksa interfeisa objektu tips saucas RTREE_INDEX_METHOD, kas satur visas nepieciešamās metodes indeksa darbības kontrolēšanai.
17
Indeksa objekta tipa definējuma ķermenis (metožu definējumi)
ODCIIndexCreate ir metode:
1) izveido indeksa datiem paredzēto tabulu (create ...), kuras
nosaukums tiek izvēlēts šādā veidā: indeksa nosaukums +
„_EIND”. Informācija par indeksa nosaukumu un shēmu, kurā
indeksu izveido, tiek ņemta no IA argumenta (SYS.ODCIIndexInfo
tips).
2) insert ... ievieto attiecīgās rindiņas identifikācijas numuru,
reģiona numuru un vērtību indeksa tabulā konkrētam rindiņas
numuram;
3) insert ... komandai nepieciešamie dati tiek iegūti ar trešā vaicājuma
palīdzību un ir piesaistīts otrajam vaicājumam kā mainīgie.
Dinamiskajā SQL tiek aktīvi izmantoti mainīgie (par ko norāda divpunkts izteiksmes
priekšā), savukārt rindiņas ID iegūšanai un sasaistei DBMS_SQL pakotnē ir
attiecīgās metodes – COLUMN_VALUE_ROWID rindiņas numura izgūšanai, kā arī
BIND_VARIABLE_ROWID, kas piesaista dinamiskās izteiksmes mainīgajam
PL/SQL mainīgo.
18
Indeksa tabulas izveide
Pamattabulas attiecīgās rindiņas numurs, kā arī reģionu vērtības ar to
attiecīgajiem numuriem tiek saglabātas indeksa tabulā, pielietojot šo
operāciju katrai pamattabulas datu rindiņai.
19
static function ODCIINDEXCREATE (IA SYS.ODCIINDEXINFO,PARMS varchar2, ENV SYS.ODCIENV) return number isI INTEGER; R ROWID; P NUMBER; V NUMBER; VAIC1 VARCHAR2(1000); VAIC2 VARCHAR2(1000);VAIC3 VARCHAR2(1000); KUR1 INTEGER; KUR2 INTEGER; KUR3 INTEGER; JUNK NUMBER; BEGIN -- konstruējam SQL vaicājumu indeksa tabulas izveidošanai VAIC1 := 'CREATE TABLE ' || IA.INDEXSCHEMA || '.' || IA.INDEXNAME || '_EIND' || '( R ROWID, RPOZ NUMBER, RVERT NUMBER)';-- izvadām informācijuDBMS_OUTPUT.PUT_LINE('ODCIINDEXCREATE>>>>>');SYS.ODCIINDEXINFODUMP(IA);DBMS_OUTPUT.PUT_LINE('ODCIINDEXCREATE>>>>>'||VAIC1);-- izpildām vaicājumuKUR1 := DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(KUR1, VAIC1, DBMS_SQL.NATIVE);JUNK := DBMS_SQL.EXECUTE(KUR1);DBMS_SQL.CLOSE_CURSOR(KUR1);
-- indeksa tabulas aizpildīšanas vaicājums; :RR - mainīgaisVAIC2 := ' INSERT INTO '|| IA.INDEXSCHEMA || '.' || IA.INDEXNAME || '_EIND' || ' SELECT :RR, ROWNUM, COLUMN_VALUE FROM THE' || ' (SELECT CAST (E.'|| IA.INDEXCOLS(1).COLNAME || '.REGIONU_VERTIBAS AS T_NUMTAB)' || ' FROM ' || IA.INDEXCOLS(1).TABLESCHEMA || '.' || IA.INDEXCOLS(1).TABLENAME || ' E' || ' WHERE E.ROWID = :RR)';DBMS_OUTPUT.PUT_LINE('ODCIINDEXCREATE>>>>>'||VAIC2);-- analizējam otro vaicajumu KUR2 := DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(KUR2, VAIC2, DBMS_SQL.NATIVE);
20
VAIC3 := 'SELECT ROWID FROM '|| IA.INDEXCOLS(1).TABLESCHEMA || '.' || IA.INDEXCOLS(1).TABLENAME; DBMS_OUTPUT.PUT_LINE('ODCIINDEXCREATE>>>>>'||VAIC3); KUR3 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(KUR3, VAIC3, DBMS_SQL.NATIVE); DBMS_SQL.DEFINE_COLUMN_ROWID(KUR3, 1, R); JUNK := DBMS_SQL.EXECUTE(KUR3); WHILE DBMS_SQL.FETCH_ROWS(KUR3) > 0 LOOP -- iegūstam kolonnu vērtības no rindiņas DBMS_SQL.COLUMN_VALUE_ROWID(KUR3, 1, R); -- piesaista iegūto rindas numuru mainīgajam DBMS_SQL.BIND_VARIABLE_ROWID(KUR2, ':RR', R); JUNK := DBMS_SQL.EXECUTE(KUR2); END LOOP;
DBMS_SQL.CLOSE_CURSOR(KUR2); DBMS_SQL.CLOSE_CURSOR(KUR3); RETURN ODCICONST.SUCCESS; END;
21
Metodes ODCIIndexStart, ODCIIndexFetch un ODCIIndexClose
Ja vaicājumā ir kāds no operatoriem WHERE daļā, kas ir sasaistīti ar
konkrēto indeksēšanas mehānismu, tad Oracle kodols var izvēlēties datus
meklēt nevis pamattabulā, veicot tās datu rindiņu pilnīgu pārlasi, bet gan
griezties pie indeksēšanas mehānisma.
Pamattabulas rindiņu identifikatoru izgūšanai tiek izmantotas
ODCIIndexStart, ODCIIndexFetch un ODCIIndexClose metodes.
1. Metode ODCIIndexStart atver kursoru speciālam vaicājumam, kurš
tiek ģenerēts uz operatora izteiksmes pamata.
2. Vaicājuma izpildes gaitā metode ODCIIndexFetch speciālā kolekcijā
(kas ir viens no ODCIIndexFetch argumentiem) tiek saglabāti
pamattabulas rindiņu numuri, kas apmierina dotā vaicājuma
nosacījumus.
3. Beigās metode ODCIIndexClose aizver kursoru.
Gala rezultātā mēs iegūstam tos datu rakstus, kuru numuri tika atgriezti ar
ODCIIndexFetch metodi.
22
ODCIIndexStart metodes var būt vairākas. To argumentu skaits un tips var
variēt – pēc standartargumentiem seko argumenti, kas atbilst operatoru
argumentiem (bez objektu tipa). Piemērā ir divi dažādi operatoru tipi:
1) ar diviem argumentiem (vērtība konkrētam reģionam);
2) tikai salīdzināmā energopatēriņa vērtība.
Kurš tieši operators tiek izsauks no trijiem, tiek noteikts metodes izpildes
gaitā, jo arguments OP (SYS.ODCIPREDINFO tips) satur informāciju par
operatoru.
23
Metodes ODCIIndexInsert, ODCIIndexUpdate un ODCIIndexDelete
Šīs trīs metodes nostrādā gluži kā trigeri datu manipulāciju gadījumā: kad dati tiek
ievadīti pamattabulā (ODCIIndexInsert), kad dati tiek atjaunoti tajā
(ODCIIndexUpdate) un kad dati tiek dzēsti no tās (ODCIIndexDelete). Ar šo metožu
palīdzību informācija tiek sinhronizēta starp pamattabulu un indeksa tabulu, lai
saturiski tās būtu ekvivalentas.
24
Indeksa tipa izveide
Kad ir realizēts indeksa objektu tips, var izveidot indeksa tipu, norādot
operatorus, uz kuru pamata indeksēšanas mehānisms spēs meklēt
atbilstošās pamatdatu rindiņas identifikatorus indeksa tabulā.
create or replace indextype ENERGO_INDEKSS FORENERGO_VIENADS(T_ENERGO_PIEPRAS, NUMBER, NUMBER),ENERGO_LIELAKS(T_ENERGO_PIEPRAS, NUMBER, NUMBER),ENERGO_MAZAKS(T_ENERGO_PIEPRAS, NUMBER, NUMBER),ENERGO_VIENADS_JEBK(T_ENERGO_PIEPRAS, NUMBER),ENERGO_LIELAKS_JEBK(T_ENERGO_PIEPRAS, NUMBER),ENERGO_MAZAKS_JEBK(T_ENERGO_PIEPRAS, NUMBER)
USING T_ENERGO_INDEKSS;
Tiek norādīts atslēgvārds FOR, pēc kura tiek uzskaitīti attiecīgie problēmsfēras
operatori un to argumenti iekavās. Pirmais arguments vienmēr ir problēmsfēras datus
raksturojošs tips, kas raksturos arī indeksējamo tabulas kolonnu. Pēc tam seko pārējo
argumentu tipi, kas tad arī nosaka metožu ODCIIndexStart skaitu.
25
Paplašināmais optimizators
Ar paplašināmā optimizatora palīdzību ir iespējams:1) sasaistīt izmaksu funkcijas ar problēmsfēru indeksiem, indeksu tipiem, pakotnēm, kā arī atsevišķām funkcijām; optimizators var novērtēt problēmsfēras indeksa skenēšanas izmaksas;2) asociēt selektivitātes funkcijas ar objektu tipu metodēm, pakotņu funkcijām vai arī atsevišķām funkcijām;3) asociēt statistikas kolekcionēšanas funkcijas ar problēmsfēras indeksiem un tabulu kolonnām;4) kārtot predikātus ar funkcijām, balstoties uz izmaksām;5) izvēlēties lietotāja definētu pieejas metodi (problēmsfēras indeksi) tabulai, balstoties uz piekļuves izmaksām;6) izmantot speciālu DBMS_STATS pakotni ar nolūku izsaukt lietotāja definētas statistikas kolekcionēšanas un dzēšanas funkcijas;7) izmantot jaunus datu vārdnīcas skatus, lai iekļautu informāciju par statistikas kolekcionēšanu, izmaksu, vai selektivitātes funkcijām, kas tiek asociētas ar kolonnām, problēmsfēras indeksiem, indeksu tipiem vai funkcijām;8) pievienot padomus (hints) ar nolūku ietekmēt funkciju predikātu izskaitļošanas kārtību.
26
Vaicājumu optimizēšana ir visefektīvākā SQL vaicājuma ceļa izvēles process. Paplašināmais optimizators dod iespēju lietotāju definētu funkciju un indeksu autoriem izveidot statistikas kolekcionēšanas, selektivitātes, kā arī izmaksu funkcijas, kuras izmanto optimizators, izvēloties vaicājuma plānu. Optimizatora izmaksu modelis tiek paplašināts, lai integrētu lietotāja nodrošinātu informāciju par procesora un ievades/izvades izmaksām, kur procesora izmaksas pēc būtības ir izmantoto datora instrukciju skaits, bet ievades/izvades izmaksas ir apstrādāto datu bloku skaits.Ar paplašināmā optimizatora palīdzību ir iespējams: sasaistīt izmaksu funkcijas ar problēmsfēru indeksiem, indeksu tipiem, pakotnēm, kā arī atsevišķām funkcijām; optimizators var novērtēt problēmsfēras indeksa skenēšanas izmaksas (Oracle 10g versijā iespējams vērtēt arī atsevišķu partīciju skenēšanas izmaksas dalītu tabulu gadījumā); asociēt selektivitātes funkcijas ar objektu tipu metodēm, pakotņu funkcijām vai arī atsevišķām funkcijām; asociēt statistikas kolekcionēšanas funkcijas ar problēmsfēras indeksiem un tabulu kolonnām; kārtot predikātus ar funkcijām, balstoties uz izmaksām; izvēlēties lietotāja definētu pieejas metodi (problēmsfēras indeksi) tabulai, balstoties uz piekļuves izmaksām; izmantot speciālu DBMS_STATS pakotni ar nolūku izsaukt lietotāja definētas statistikas kolekcionēšanas un dzēšanas funkcijas; izmantot jaunus datu vārdnīcas skatus, lai iekļautu informāciju par statistikas kolekcionēšanu, izmaksu, vai selektivitātes funkcijām, kas tiek asociētas ar kolonnām, problēmsfēras indeksiem, indeksu tipiem vai funkcijām; pievienot padomus (hints) ar nolūku ietekmēt funkciju predikātu izskaitļošanas kārtību.
Optimizators ģenerē izpildes plānu SQL un datu manipulācijas valodas vaicājumiem – SELECT, INSERT, UPDATE, vai arī DELETE izteiksmēm.
Izpildes plāns iekļauj pieejas metodi katrai tabulai no FROM daļas, un kārtu, kas tiek saukta par apvienošanas kārtu, tabulām no FROM daļas. Sistēmas definētas pieejas metodes iekļauj indeksus, hešu klasterus un tabulas skenēšanu. Optimizators izvēlas plānu, ģenerējot apvienošanas kārtas kopu (permutācijas), izskaitļojot katras izmaksas, un tad izvēloties procesu ar zemākajām izmaksām. Katrai apvienošanas kārtas tabulai
27
optimizators izskaitļo katras iespējamās piekļuves un apvienošanas metodes izmaksas, pēc tam izvēlas to, kurai ir zemākās izmaksas. Apvienošanas kārtas izmaksas ir pieejas un apvienošanas metožu izmaksu summa. Izmaksas izskaitļo ar algoritmu palīdzību, kas kopā ietver izmaksu modeli. Izmaksu modelis iekļauj sevī mainīgu detalizācijas līmeni par fizisko vidi, kurā vaicājums tiek izpildīts. Attēlā redzama izmaksu optimizatora (IO) darbība vaicājuma laikā: no iespējamajiem ceļiem (C1, C2, C3 un C4) tiek izvēlēts tas ceļš, kura izmaksas (I) ir minimālas; rezultātā izmaksu optimizators ietekmē apvienošanas kārtu, t.i., kādā secībā tiks apskatītas tabulas no WHERE daļas, kā arī pieejas metodes – kādā veidā dati tiks atlasīti no katras tabulas. Ar padomu (hints) palīdzību var tiešā veidā ietekmēt funkciju predikātu izskaitļošanas kārtību.
Lietotāja definētajiem operatoriem un problēmsfēras indeksiem paplašināmais optimizators dod iespēju kontrolēt trīs pamatkomponentes, kuras tiek izmantotas, izvēloties vaicājuma izpildes plānu: statistiku, selektivitāti un izmaksas.
28
Statistika
Optimizators izmanto statistiku par vaicājumā minētajiem objektiem, lai izskaitļotu selektivitāti un izmaksas, tātad, tas ir rīks, kas nodrošina papildinformāciju par problēmsfēras objektiem. Realizējot paplašināmā optimizatora metodes, statistikai tiek paredzēta metode ODCIStatsCollect, ar kuras palīdzību tiks savākta statistika par noteikta tipa kolonnu (parasti saista ar problēmsfēras tipa kolonnu, kas tiek indeksēta). Tas, ko tieši veic šī metode, nav zināms. Taču tās savāktā informācija kalpos par pamatu selektivitātes un izmaksu analīzei.Šī metode tiek izmantota tajā gadījumā, ja statistika tiek asociēta ar noteiktu tabulas kolonnu, un vēlāk izsaukta ANALYZE komanda – kā tas ir redzams attēlā.
Statistika tiek asociēta ar noteiktu kolonnu, izmantojot ODCIStatsTips objektu tipu, kuram noteikti jārealizē ODCIStatsCollect metodi analizējamās kolonnas tipam.
29
Selektivitāte
Optimizators izmanto statistiku, lai izskaitļotu predikātu selektivitāti. Predikāta selektivitāte ir ar predikātu izgūstamo rindiņu skaita dalījums ar kopējo rindiņu skaitu (līdz ar to tas ir skaitlis no intervālā [0; 1]). Praktiskajā daļā izmantotajam piemēram varētu izveidot statistikas savākšanas funkciju, kas vienkārši katram reģionam atrastu minimālo un maksimālo vērtību. Balstoties uz šo informāciju, varētu aptuveni novērtēt, cik procentuāli daudz rindiņu tiks izgūtas, ja tiks meklēta noteikta vērtība. Dažos gadījumos tas var nodrošināt izvairīšanos no datu pārlases. Ja mēs atlasām datus, izvēloties tās datu rindiņas, kurām noteikta reģiona vērtība ir vienāda ar prasīto vērtību, bet prasītā vērtība neietilpst intervālā starp minimālo un maksimālo vērtību, tad, neapšaubāmi, selektivitāte tādam predikātam būs vienāda ar 0,- neviena datu rindiņa neapmierinās predikāta vērtību. Selektivitāte palīdz izvēlēties optimālo apvienošanas kārtu, un piekļuves metodes, balstoties uz WHERE daļā norādītajiem predikātiem.
30
Izmaksas
Optimizators novērtē dažādu piekļuves ceļu izmaksas, lai izvēlētos optimālo plānu. Piemēram, tas var izskaitļot indeksa izmantošanas un pilnas tabulas skenēšanas izmaksas, lai varētu izvēlēties starp šīm divām pieejas metodēm. Kodola paplašinājuma definēto problēmsfēras indeksu gadījumā optimizators nezin neko par indeksu iekšējo glabāšanas struktūru. Tādā veidā optimizators nevar precīzi izvērtēt tādu indeksu izmantošanas izmaksas. Tāpat optimizators pēc noklusējuma nezin neko par lietotāja funkciju procesora resursu patēriņu. Funkcijas var arī patērēt ievada/izvades resursus, gadījumā ja tā apstrādā lielo objektu eksemplāruLai varētu veikt tāda veida analīzi, paplašināmais optimizators realizē noteiktas funkcijas, ar kuru palīdzību tiek noteiktas lietotāju definēto funkciju un problēmsfēras indeksu izmantošanas izmaksas.Lietotāja definētās izmaksu funkcijas var atgriezt trīs parametrus, kas raksturo lietotāja funkcijas vai problēmsfēras indeksa izmantošanas resursu ietilpību: cpu – datora instrukciju skaits, kuras izpilda funkcija vai indeksa implementācija; i/o – problēmsfēras indeksa vai funkcijas nolasīto datu bloku skaits network – pārraidīto bloku skaits tīklā.
31
Paplašināmā optimizatora interfeisa metožu raksturojumi
Metode AprakstsODCIStatsCollect Metode statistikas savākšanai kolonnai vai
indeksa datiem.ODCIStatsDelete Izdzēš statistiku par kolonnu vai indeksa datiem.ODCIStatsSelectivity Novērtē lietotāja definētu funkcijas vai operatora
predikāta selektivitāti.ODCIStatsFunctionCost Balstoties uz uzdotajiem funkcijas parametriem,
izskaitļo funkcijas izpildes izmaksas.ODCIStatsIndexCost Balstoties uz uzdoto operatora predikātu,
izskaitļo problēmsfēras indeksa skenēšanas izmaksas.
32
Vaicājumu izpildeIndeksa mehānisms tiek iedarbināts gadījumā, kad vaicājuma WHERE daļā parādās
noteikts salīdzināšanas operators, kas norāda, pēc kādiem kritērijiem dati tiek
atlasīti. Problēmsfēras indeksa gadījumā tiek izsauktas indeksa metodes
ODCIIndexStart, ODCIIndexFetch un ODCIIndexClose, ar kuru palīdzību tiek
izskatīta indeksa tabula un atgrieztas vajadzīgās rindiņas.
Ja vaicājums tiek veikts bez problēmsfēras indeksa operatoriem WHERE daļā, tad
vaicājuma izpildes plānā redzams, ka Oracle veic pilnu piekļuvi pamattabulai –
TABLE ACCESS FULL, ko var novērot, analizējot vaicājuma izpildes plānu.
Ja tiek veikts vaicājums, kura WHERE daļā parādās kāds no problēmsfēras
operatoriem, kas ir saistīts ar indeksa tipu, izpildes plāns norāda, ka datu atlase notiek
no indeksa tabulas EINDEKSS_EIND.
33
Lietotāja definētas agregātfunkcijas
Oracle nodrošina lietotāju ar noteiktām visiem labi zināmām agregātfunkcijām MAX, MIN, SUM u.c., kas veic operācijas ar rindiņu kopām. Šīs definētās agregātfunkcijas var tikt izmantotas tikai skalāriem datiem. Taču bieži rodas vajadzība definēt kādu jaunu funkciju datu analīzei, vai arī agregātfunkciju, kas darbotos ar sarežģītiem – lietotāja definētajiem datiem, līdz ar to realizējot ar problēmsfēru saistīto loģiku.Lietotāju definētas agregātfunkcijas, analoģiski paplašināmās indeksācijas mehānismam un paplašināmajam optimizatoram, tiek reģistrētas serverī ar interfeisu palīdzību; šajā gadījumā tas ir ODCIAggregate interfeiss, kuram ir paredzētas metodes agregācijas uzsākšanai (ODCIAggregateInititalize), agregācijas solim (ODCIAggregateIterate), kā arī agregācijas nobeigšanai (ODCIAggregateTerminate).
Lietotāja definētas agregātfunkcijas var piemērot jebkura tipa datiem, līdz ar to arī skalārajiem datiem tas varētu būt ļoti noderīgs rīks, piem., strādājot ar sarežģītiem finansiāliem vai zinātniskiem statistikas datiem.
Efektivitātes apsvērumu dēļ agregātfunkcijas cikli bieži vien tiek izpildīti paralēli. T.i., vienas datu kopas dažādiem apgabaliem var tikt piemērota vien un tā pati agregātfunkcija, bet vēlāk to rezultāti apvienoti attiecīgā veidā. Piem., ja tā ir summa, tad tiek saskaitīta paralēlajos procesos iegūtās summas. Ja tā ir mazākās vērtības, tad rezultāts ir mazākā vērtība no paralēlajiem procesiem. Shematiski tādas agregātfunkcijas darbība ir parādīta . attēlā.Kā redzams, pirms cikla nobeigšanas jāizpildās apvienojuma funkcijai. Tādu agregātfunkciju realizētajā objektu tipā ir papildus funkcija – ODCIAggregateMerge, kura veic apvienošanas funkcijas.
34
Agregātfunkcijas paralēlās darbības shēma
Agregātfunkciju interfeisa metožu raksturojumiMetode AprakstsODCIAggregateInitialize Šo metodi Oracle izsauc, lai inicializētu
lietotāja definētu agregātfunkciju skaitļošanas procesu. Inicializēta agregāta konteksts tiek nodots Oracle kā objektu tipa eksemplārs (kas var saturēt agregātvērtības skaitļošanai nepieciešamos atribūtus)
ODCIAggregateIterate Metode tiek atkārtoti izsaukta katrai agregātfunkcijā pielietotajai vērtībai, kas tiek nodota funkcijai kā arguments. Arī ar šo agregātvērtības skaitļošanas sesiju saistītais objektu tips (konteksts) tiek nodots kā arguments. Rezultātā funkcija apstrādā jauno vērtību(as), un atgriež DBVS atjaunoto kontekstu. Jāpiebilst, ka NULL vērtības netiek apstrādātas.
ODCIAggregateMerge Metodi Oracle izsauc paralēlās agregātfunkciju skaitļošanas gadījumā. Tā kombinē divus agregāciju kontekstus un atgriež galīgo rezultātu.
ODCIAggregateTerminate Metode tiek izsaukta agregācijas pēdējā solī. Metode atgriež rezultāta vērtību, balstoties uz agregācijas kontekstu.
35
Abstraktās tabulas un tabulu funkcijas
Kodola paplašinājuma izstrādātājam var rasties vajadzība piekļūt datiem, kas ir ārpus datu bāzes vai arī atrodas lielo objektu eksemplāros. Tādos gadījumos DBVS nezin neko par šo datu struktūru, pat ja tie ir noteiktā veidā strukturēti. Šajā gadījumā ir iespējams rīkoties divos veidos:
1) izveidot abstrakto tabulu;2) vaicājumos izmantot tabulu funkciju.
Abstraktā tabula tiek interpretēta kā parasta tabula. Par tās saturu, kas pēc būtības ir virtuāls, atbild noteikts objektu tips, kas realizē ODCITable interfeisu. Piemērs varētu būt kāds fails failu sistēmā. Piemēram XML fails, kura struktūra nav zināma datu bāzes sistēmai, bet tajā glabājas tabulāri interpretējami dati.
Abstrakto tabulu interfeisa metožu raksturojumi
Metode AprakstsODCITableStart Uzsāk virtuālo tabulas izskatīšanu.ODCITableFetch Atgriež rindiņu kopu kārtējā solī.ODCITableClose Veic nobeigšanas procedūras, kad datu
izgūšana ir beigusies.
36
ODCITable interfeisa metožu darbības shēma
Abstrakto tabulu darbības princips ir līdzīgs kursoriem – kamēr rezultāts nav NULL, notiek izgūstamo datu apstrāde (t.i., tā tiek interpretēta kā virtuāla tabula). Savukārt, kad šis process beidzas, ar ODCITableClose metodes palīdzību tiek veikti nobeigšanas darbi (piem., aizvērti datu bāzes kursori vai arī attīrītas temporālās struktūras vai arī tabulas).
Rezultātā lietotāja dati tiek interpretēti tabulas veidā, un tālākā darbība ar tādu tabulu norit gluži kā ar parastu. Ja ir vajadzība datus papildināt vai izdzēst (kas, protams, virtuālās tabulas gadījumā nav iespējams), tad var veidot uz tādas tabulas balstītu skatu un realizēt INSTEAD OF trigeri, kas imitēs datu ierakstīšanu šajā tabulā vai dzēšanu no tās (t.i., darbosies ar datu avotu).
37
Abstraktās tabulas izveidošana
Abstraktās tabulas izveidošanas piemērs:
Tagad, griežoties pie abstraktās tabulas, iteratīvai rindiņu izgūšanai tiks pielietotas ODCITableTips objektu tipa metodes, attiecīgi attēlā redzamajai shēmai.Kodola paplašinājuma izstrādātājam var parādīties vajadzība pēc dinamiskas, iteratīvas uzvedības pār virtuāli izveidotajām tabulām. Paplašināšanas arhitektūra tāpat nodrošina iteratīvas tabulu funkcijas kā papildinājumu abstraktām tabulām.Tabulu funkcijas ir tādas funkcijas, kas rezultātā izdod rindiņu kolekciju (vai nu iekļautu tabulu vai arī VARRAY – mainīga izmēra masīvu) ar nolūku veikt vaicājumus šai datu kopai, analoģiski fiziskajai datu bāzes tabulai. Tabulu funkcija var tikt izmantota gluži kā datu bāzes tabulas nosaukums vaicājuma FROM daļā.
Tādas funkcijas ir bieži noderīgas datu interpretācijai, jo kā argumentus var pieņemt gan kolekciju tipu, gan arī kursora mainīgo (REF CURSOR). Taču pēc būtības tās ir ļoti līdzīgas abstraktajām tabulām – tās tiek piesaistītas ODCITable interfeisa metodes realizējošam objektu tipam.
Atkarībā no tā, vai noteiktu virtuālu datu izgūšanā ir nepieciešamība norādīt parametrus, jāizvēlas attiecīgais veids, kā šo izgūšanu realizēt – vai nu abstraktās tabulas (kuros vai nu netiek norādīti nekādi parametri, vai arī tie tiek norādīti tabulas izveidošanas brīdī), vai arī tabulu funkcijas (kurās ik reizes var norādīt dažādus parametrus).
38
Using Pipelined and Parallel Table Functions
Table functions are functions that produce a collection of rows (either a nested table or a varray) that can be queried like a physical database table. You use a table function like the name of a database table, in the FROM clause of a query.A table function can take a collection of rows as input. An input collection parameter can be either a collection type or a REF CURSOR.Execution of a table function can be parallelized, and returned rows can be streamed directly to the next process without intermediate staging. Rows from a collection returned by a table function can also be pipelined—that is, iteratively returned as they are produced instead of in a batch after all processing of the table function's input is completed.