RakstÄ«Å”anas un lasÄ«Å”anas lÄ«dzsvaroÅ”ana datu bÄzÄ
IepriekÅ”ÄjÄ raksts Es aprakstÄ«ju tÄdas datu bÄzes koncepciju un ievieÅ”anu, kas veidota, pamatojoties uz funkcijÄm, nevis tabulÄm un laukiem kÄ relÄciju datu bÄzÄs. TajÄ tika sniegti daudzi piemÄri, kas parÄda Ŕīs pieejas priekÅ”rocÄ«bas salÄ«dzinÄjumÄ ar klasisko. Daudzi uzskatÄ«ja, ka tie nav pietiekami pÄrliecinoÅ”i.
Å ajÄ rakstÄ es parÄdÄ«Å”u, kÄ Å”Ä« koncepcija ļauj Ätri un Ärti lÄ«dzsvarot rakstÄ«Å”anu un nolasÄ«Å”anu datubÄzÄ, nemainot darbÄ«bas loÄ£iku. LÄ«dzÄ«gu funkcionalitÄti ir mÄÄ£inÄts ieviest mÅ«sdienu komerciÄlajÄs DBVS (jo Ä«paÅ”i Oracle un Microsoft SQL Server). Raksta beigÄs parÄdÄ«Å”u, ka tas, ko viÅi izdarÄ«ja, maigi izsakoties, nav Ä«sti izdevies.
Apraksts
TÄpat kÄ iepriekÅ”, labÄkas izpratnes labad aprakstu sÄkÅ”u ar piemÄriem. Teiksim, ir jÄievieÅ” loÄ£ika, kas atgriezÄ«s nodaļu sarakstu ar tajÄs esoÅ”o darbinieku skaitu un kopÄjo algu.
FunkcionÄlÄ datu bÄzÄ tas izskatÄ«tos Å”Ädi:
CLASS Department āŠŃŠ“ŠµŠ»ā;
name āŠŠ°ŠøŠ¼ŠµŠ½Š¾Š²Š°Š½ŠøŠµā = DATA STRING[100] (Department);
CLASS Employee āŠ”Š¾ŃŃŃŠ“Š½ŠøŠŗā;
department āŠŃŠ“ŠµŠ»ā = DATA Department (Employee);
salary āŠŠ°ŃŠæŠ»Š°ŃŠ°ā = DATA NUMERIC[10,2] (Employee);
countEmployees āŠŠ¾Š»-Š²Š¾ ŃŠ¾ŃŃŃŠ“Š½ŠøŠŗŠ¾Š²ā (Department d) =
GROUP SUM 1 IF department(Employee e) = d;
salarySum āŠ”ŃŠ¼Š¼Š°ŃŠ½Š°Ń Š·Š°ŃŠæŠ»Š°ŃŠ°ā (Department d) =
GROUP SUM salary(Employee e) IF department(e) = d;
Å Ä« vaicÄjuma izpildes sarežģītÄ«ba jebkurÄ DBVS bÅ«s lÄ«dzvÄrtÄ«ga O (darbinieku skaits)jo Å”im aprÄÄ·inam ir nepiecieÅ”ams skenÄt visu darbinieku tabulu un pÄc tam tos grupÄt pa departamentiem. BÅ«s arÄ« kÄds neliels (uzskatÄm, ka darbinieku ir daudz vairÄk nekÄ nodaļÄs) pielikums atkarÄ«bÄ no izvÄlÄtÄ plÄna O (darbinieku skaits žurnÄlÄ) vai O (nodaļu skaits) grupÄÅ”anai un tÄ tÄlÄk.
Ir skaidrs, ka izpildes pieskaitÄmÄs izmaksas dažÄdÄs DBVS var atŔķirties, taÄu sarežģītÄ«ba nekÄdÄ veidÄ nemainÄ«sies.
IerosinÄtajÄ realizÄcijÄ funkcionÄlÄ DBVS Ä£enerÄs vienu apakÅ”vaicÄjumu, kas aprÄÄ·inÄs nodaļai nepiecieÅ”amÄs vÄrtÄ«bas un pÄc tam izveidos JOIN ar nodaļas tabulu, lai iegÅ«tu nosaukumu. TaÄu katrai funkcijai, deklarÄjot, ir iespÄjams uzstÄdÄ«t Ä«paÅ”u MATERIALIZÄTA marÄ·ieri. SistÄma automÄtiski izveidos atbilstoÅ”u lauku katrai Å”Ädai funkcijai. Mainot funkcijas vÄrtÄ«bu, tajÄ paÅ”Ä darÄ«jumÄ mainÄ«sies arÄ« lauka vÄrtÄ«ba. Piekļūstot Å”ai funkcijai, tiks piekļūts iepriekÅ” aprÄÄ·inÄtajam laukam.
Jo Ä«paÅ”i, ja funkcijÄm iestatÄt MATERIALIZED skaitÄ«tDarbiniekus Šø algaSumma, tad tabulai ar nodaļu sarakstu tiks pievienoti divi lauki, kuros tiks saglabÄts darbinieku skaits un viÅu kopÄjÄ alga. Ikreiz, kad notiek darbinieku, viÅu algu vai departamentu piederÄ«bas izmaiÅas, sistÄma automÄtiski mainÄ«s Å”o lauku vÄrtÄ«bas. IepriekÅ” minÄtais vaicÄjums tieÅ”i piekļūs Å”iem laukiem un tiks izpildÄ«ts O (nodaļu skaits).
KÄdi ir ierobežojumi? Tikai viena lieta: Å”Ädai funkcijai ir jÄbÅ«t ierobežotam skaitam ievades vÄrtÄ«bu, kurÄm ir noteikta tÄs vÄrtÄ«ba. PretÄjÄ gadÄ«jumÄ nebÅ«s iespÄjams izveidot tabulu, kurÄ ir saglabÄtas visas tÄs vÄrtÄ«bas, jo nevar bÅ«t tabula ar bezgalÄ«gu rindu skaitu.
PiemÄrs:
employeesCount āŠŠ¾Š»ŠøŃŠµŃŃŠ²Š¾ ŃŠ¾ŃŃŃŠ“Š½ŠøŠŗŠ¾Š² Ń Š·Š°ŃŠæŠ»Š°ŃŠ¾Š¹ > Nā (Department d, NUMERIC[10,2] N) =
GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;
Å Ä« funkcija ir definÄta bezgalÄ«gam skaitam N vÄrtÄ«bu (piemÄram, jebkura negatÄ«va vÄrtÄ«ba ir piemÄrota). TÄpÄc uz tÄ nevar likt MATERIALIZÄTU. TÄtad tas ir loÄ£isks, nevis tehnisks ierobežojums (tas ir, nevis tÄpÄc, ka mÄs to nevarÄtu ieviest). PretÄjÄ gadÄ«jumÄ ierobežojumu nav. Varat izmantot grupÄÅ”anu, kÄrtoÅ”anu, UN un VAI, NODAÄ»A, rekursiju utt.
PiemÄram, iepriekÅ”ÄjÄ raksta 2.2. problÄmÄ varat ievietot MATERIALIZED abÄm funkcijÄm:
bought 'ŠŃŠæŠøŠ»' (Customer c, Product p, INTEGER y) =
GROUP SUM sum(Detail d) IF
customer(order(d)) = c AND
product(d) = p AND
extractYear(date(order(d))) = y MATERIALIZED;
rating 'Š ŠµŠ¹ŃŠøŠ½Š³' (Customer c, Product p, INTEGER y) =
PARTITION SUM 1 ORDER DESC bought(c, p, y), p BY c, y MATERIALIZED;
SELECT contactName(Customer c), name(Product p) WHERE rating(c, p, 1997) < 3;
SistÄma pati izveidos vienu tabulu ar tipa taustiÅiem Klients, Prece Šø VESELS SKAITLIS, pievienos tam divus laukus un atjauninÄs tajos esoÅ”Äs lauku vÄrtÄ«bas ar jebkÄdÄm izmaiÅÄm. Kad tiks veikti turpmÄki Å”o funkciju izsaukumi, tÄs netiks aprÄÄ·inÄtas, bet gan vÄrtÄ«bas tiks nolasÄ«tas no atbilstoÅ”ajiem laukiem.
Izmantojot Å”o mehÄnismu, jÅ«s varat, piemÄram, atbrÄ«voties no rekursijÄm (CTE) vaicÄjumos. Jo Ä«paÅ”i apsveriet grupas, kas veido koku, izmantojot bÄrna/vecÄku attiecÄ«bas (katrai grupai ir saite uz savu vecÄku):
parent = DATA Group (Group);
FunkcionÄlÄ datu bÄzÄ rekursijas loÄ£iku var norÄdÄ«t Å”Ädi:
level (Group child, Group parent) = RECURSION 1l IF child IS Group AND parent == child
STEP 2l IF parent == parent($parent);
isParent (Group child, Group parent) = TRUE IF level(child, parent) MATERIALIZED;
TÄ kÄ funkcijai isParent ir atzÄ«mÄts MATERIALIZÄTS, tad tam tiks izveidota tabula ar diviem taustiÅiem (grupÄm), kurÄ lauks isParent bÅ«s patiess tikai tad, ja pirmÄ atslÄga ir otrÄs atslÄga. Ierakstu skaits Å”ajÄ tabulÄ bÅ«s vienÄds ar grupu skaitu, kas reizinÄts ar koka vidÄjo dziļumu. Ja jums ir nepiecieÅ”ams, piemÄram, saskaitÄ«t noteiktas grupas pÄcnÄcÄju skaitu, varat izmantot Å”o funkciju:
childrenCount (Group g) = GROUP SUM 1 IF isParent(Group child, g);
SQL vaicÄjumÄ nebÅ«s CTE. TÄ vietÄ bÅ«s vienkÄrÅ”a GROUP BY.
Izmantojot Å”o mehÄnismu, varat arÄ« viegli denormalizÄt datu bÄzi, ja nepiecieÅ”ams:
CLASS Order 'ŠŠ°ŠŗŠ°Š·';
date 'ŠŠ°ŃŠ°' = DATA DATE (Order);
CLASS OrderDetail 'Š”ŃŃŠ¾ŠŗŠ° Š·Š°ŠŗŠ°Š·Š°';
order 'ŠŠ°ŠŗŠ°Š·' = DATA Order (OrderDetail);
date 'ŠŠ°ŃŠ°' (OrderDetail d) = date(order(d)) MATERIALIZED INDEXED;
Izsaucot funkciju dati pasÅ«tÄ«juma rindai lauks, kuram ir indekss, tiks nolasÄ«ts no tabulas ar pasÅ«tÄ«juma rindÄm. Kad pasÅ«tÄ«juma datums mainÄs, sistÄma pati automÄtiski pÄrrÄÄ·inÄs denormalizÄto datumu rindÄ.
PriekŔrocības
Kam domÄts viss Å”is mehÄnisms? KlasiskajÄs DBVS bez vaicÄjumu pÄrrakstÄ«Å”anas izstrÄdÄtÄjs vai DBA var mainÄ«t tikai indeksus, noteikt statistiku un norÄdÄ«t vaicÄjumu plÄnotÄjam, kÄ tos izpildÄ«t (un padomi ir pieejami tikai komerciÄlajÄs DBVS). NeatkarÄ«gi no tÄ, kÄ viÅi censtos, viÅi nevarÄs izpildÄ«t pirmo vaicÄjumu rakstÄ O (nodaļu skaits) nemainot vaicÄjumus vai nepievienojot aktivizÄtÄjus. PiedÄvÄtajÄ shÄmÄ izstrÄdes stadijÄ nav jÄdomÄ par datu glabÄÅ”anas struktÅ«ru un kÄdus apkopojumus izmantot. To visu var viegli mainÄ«t lidojumÄ, tieÅ”i ekspluatÄcijÄ.
PraksÄ tas izskatÄs Å”Ädi. Daži cilvÄki izstrÄdÄ loÄ£iku, pamatojoties tieÅ”i uz veicamo uzdevumu. ViÅi nesaprot ne algoritmus un to sarežģītÄ«bu, ne izpildes plÄnus, ne savienojumu veidus, ne arÄ« citus tehniskos komponentus. Å ie cilvÄki ir vairÄk biznesa analÄ«tiÄ·i nekÄ izstrÄdÄtÄji. PÄc tam tas viss tiek nodots testÄÅ”anai vai ekspluatÄcijai. IespÄjo ilgstoÅ”u vaicÄjumu reÄ£istrÄÅ”anu. Kad tiek atklÄts garÅ” vaicÄjums, citi cilvÄki (tehniskÄki ā bÅ«tÄ«bÄ DBA) nolemj iespÄjot MATERIALIZED kÄdÄ starpfunkcijÄ. Tas nedaudz palÄnina ierakstÄ«Å”anu (jo tam ir jÄatjaunina papildu lauks darÄ«jumÄ). TomÄr ne tikai Å”is vaicÄjums ir ievÄrojami paÄtrinÄts, bet arÄ« visi citi, kas izmanto Å”o funkciju. TajÄ paÅ”Ä laikÄ ir samÄrÄ viegli izlemt, kuru funkciju Ä«stenot. Divi galvenie parametri: iespÄjamo ievades vÄrtÄ«bu skaits (tas ir, cik ierakstu bÅ«s attiecÄ«gajÄ tabulÄ) un cik bieži tas tiek izmantots citÄs funkcijÄs.
Analogi
MÅ«sdienu komerciÄlajÄm DBVS ir lÄ«dzÄ«gi mehÄnismi: MATERIALIZÄTS SKATS ar FAST REFRESH (Oracle) un INDEXED VIEW (Microsoft SQL Server). PostgreSQL MATERIALIZED VIEW nevar atjauninÄt darÄ«jumÄ, bet tikai pÄc pieprasÄ«juma (un pat ar ļoti stingriem ierobežojumiem), tÄpÄc mÄs to neuzskatÄm. Bet tiem ir vairÄkas problÄmas, kas bÅ«tiski ierobežo to izmantoÅ”anu.
PirmkÄrt, jÅ«s varat iespÄjot materializÄciju tikai tad, ja jau esat izveidojis parasto SKATU. PretÄjÄ gadÄ«jumÄ jums bÅ«s jÄpÄrraksta atlikuÅ”ie pieprasÄ«jumi, lai piekļūtu jaunizveidotajam skatam, lai izmantotu Å”o materializÄciju. Vai arÄ« atstÄt visu kÄ ir, bet tas bÅ«s vismaz neefektÄ«vi, ja bÅ«s noteikti jau iepriekÅ” aprÄÄ·inÄti dati, bet daudzi vaicÄjumi ne vienmÄr tos izmanto, bet pÄrrÄÄ·ina.
ViÅiem nevar bÅ«t GROUPBY klauzulas vai apkopojumi.
Visu tabulu rindas FROM sarakstam ir jÄparÄdÄs SELECT vaicÄjuma saraksts.
MaterializÄtiem skata žurnÄliem ir jÄbÅ«t ar rindÄm visÄm pamata tabulÄm FROM vaicÄjuma saraksts.
JÅ«s nevarat izveidot Ätri atsvaidzinÄmu materializÄtu skatu no vairÄkÄm tabulÄm ar vienkÄrÅ”iem savienojumiem, kas ietver objekta tipa kolonnu SELECT paziÅojums, apgalvojums.
TurklÄt jÅ«su izvÄlÄtÄ atsvaidzinÄÅ”anas metode nebÅ«s optimÄli efektÄ«va, ja:
DefinÄjoÅ”ais vaicÄjums izmanto ÄrÄjo savienojumu, kas darbojas kÄ iekÅ”Äjais savienojums. Ja definÄjoÅ”ais vaicÄjums satur Å”Ädu savienojumu, apsveriet definÄjoÅ”Ä vaicÄjuma pÄrrakstÄ«Å”anu, lai ietvertu iekÅ”Äjo savienojumu.
JÅ«su darbs IR Klientu apkalpoÅ”ana SELECT materializÄtÄ skata sarakstÄ ir izteiksmes vairÄku tabulu kolonnÄs.
5.3.8.6. Ierobežojumi Ätrai atsvaidzinÄÅ”anai materializÄtiem skatiem ar apkopojumiem
DefinÄjot vaicÄjumus materializÄtiem skatiem ar apkopojumiem vai savienojumiem, ir Å”Ädi ÄtrÄs atsvaidzinÄÅ”anas ierobežojumi.
ÄtrÄ atsvaidzinÄÅ”ana tiek atbalstÄ«ta abiem ONCOMMIT un ONDEMAND materializÄti viedokļi, tomÄr tiek piemÄroti Å”Ädi ierobežojumi:
VisÄm tabulÄm materializÄtajÄ skatÄ ir jÄbÅ«t materializÄtÄ skata žurnÄliem, un materializÄtÄ skata žurnÄliem:
Ietver visas kolonnas no tabulas, uz kuru ir atsauce materializÄtajÄ skatÄ.
NorÄdiet ar ROWID un INCLUDINGNEWVALUES.
norÄdiet SEQUENCE klauzulu, ja paredzams, ka tabulÄ bÅ«s ieliktÅu/tieÅ”Äs ielÄdes, dzÄÅ”anas un atjauninÄjumu kombinÄcija.
Tikai SUM, COUNT, AVG, STDDEV, VARIANCE, MIN un MAX tiek atbalstÄ«ti Ätrai atsvaidzinÄÅ”anai.
COUNT(*) jÄprecizÄ.
ApkopotajÄm funkcijÄm ir jÄbÅ«t tikai kÄ izteiksmes visattÄlÄkajai daļai. Tas ir, agregÄti, piemÄram, AVG(AVG(x)) or AVG(x)+ AVG(x) nav atļauts.
Par katru agregÄtu, piemÄram, AVG(expr), atbilstoÅ”ais COUNT(expr) jÄbÅ«t klÄt. Oracle to iesaka SUM(expr) jÄprecizÄ.
If VARIANCE(expr) or STDDEV(expr) ir norÄdÄ«ts, COUNT(expr) un SUM(expr) jÄprecizÄ. Oracle to iesaka SUM(expr *expr) jÄprecizÄ.
JÅ«su darbs IR Klientu apkalpoÅ”ana SELECT kolonna definÄjoÅ”ajÄ vaicÄjumÄ nevar bÅ«t sarežģīta izteiksme ar kolonnÄm no vairÄkÄm bÄzes tabulÄm. IespÄjamais risinÄjums ir izmantot ligzdotu materializÄtu skatu.
JÅ«su darbs IR Klientu apkalpoÅ”ana SELECT sarakstÄ jÄiekļauj viss GROUPBY kolonnas.
MaterializÄtais skats nav balstÄ«ts uz vienu vai vairÄkÄm attÄlÄm tabulÄm.
Ja izmantojat CHAR datu tips materializÄtÄ skata žurnÄla filtra kolonnÄs, galvenÄs vietnes un materializÄtÄ skata rakstzÄ«mju kopÄm ir jÄbÅ«t vienÄdÄm.
Ja materializÄtajam skatam ir kÄds no Å”iem parametriem, ÄtrÄ atsvaidzinÄÅ”ana tiek atbalstÄ«ta tikai parastajos DML ievietojumos un tieÅ”Äs ielÄdes.
MaterializÄti skati ar MIN or MAX agregÄti
MaterializÄti skati, kuriem ir SUM(expr) bet nÄ COUNT(expr)
MaterializÄti skati bez COUNT(*)
Å Äds materializÄts skats tiek saukts par tikai ievietoÅ”anas materializÄto skatu.
MaterializÄts skats ar MAX or MIN ir Ätri atsvaidzinÄms pÄc dzÄÅ”anas vai jauktiem DML priekÅ”rakstiem, ja tam nav a WHERE klauzula.
MaksimÄlajai/minÅ«tei Ätrajai atsvaidzinÄÅ”anai pÄc dzÄÅ”anas vai jaukta DML nav tÄda pati darbÄ«ba kÄ tikai ievietoÅ”anas gadÄ«jumÄ. Tas dzÄÅ” un atkÄrtoti aprÄÄ·ina skarto grupu maksimÄlÄs/minÅ«tes vÄrtÄ«bas. Jums ir jÄapzinÄs tÄ veiktspÄjas ietekme.
MaterializÄti skati ar nosauktiem skatiem vai apakÅ”vaicÄjumiem FROM klauzulu var Ätri atsvaidzinÄt, ja skatus var pilnÄ«bÄ apvienot. InformÄciju par to, kuri skati tiks apvienoti, skatiet Oracle datu bÄzes SQL valodas atsauce.
Ja nav ÄrÄjo savienojumu, jums var bÅ«t patvaļīgas atlases un pievienoÅ”anÄs WHERE klauzula.
MaterializÄti apkopotie skati ar ÄrÄjiem savienojumiem ir Ätri atsvaidzinÄmi pÄc parastÄs DML un tieÅ”Äs ielÄdes, ja ir modificÄta tikai ÄrÄjÄ tabula. UnikÄliem ierobežojumiem ir jÄbÅ«t arÄ« iekÅ”ÄjÄs savienoÅ”anas tabulas savienojuma kolonnÄs. Ja ir ÄrÄjie savienojumi, visi savienojumi ir jÄsavieno ar ANDs un jÄizmanto vienÄdÄ«ba (=) operators.
MaterializÄtiem skatiem ar CUBE, ROLLUP, grupÄÅ”anas kopas vai to savienoÅ”ana, tiek piemÄroti Å”Ädi ierobežojumi:
JÅ«su darbs IR Klientu apkalpoÅ”ana SELECT sarakstÄ jÄiekļauj grupÄÅ”anas atŔķirÄ«bas zÄ«me, kas var bÅ«t a GROUPING_ID funkcija uz visiem GROUPBY izteicieni vai GROUPING funkcijas katrai pa vienai GROUPBY izteiksme. PiemÄram, ja GROUPBY materializÄtÄ skatÄ«juma klauzula ir "GROUPBYCUBE(a, b)", tad SELECT sarakstÄ jÄiekļauj vai nu "GROUPING_ID(a, b)Ā» vai Ā«GROUPING(a)ANDGROUPING(b)Ā» lai materializÄtais skats bÅ«tu Ätri atjaunojams.
GROUPBY nedrÄ«kst radÄ«t dublÄtus grupÄjumus. PiemÄram, "GROUP BY a, ROLLUP(a, b)"nav Ätri atsvaidzinÄms, jo tas rada dublÄtus grupÄjumus"(a), (a, b), AND (a)".
5.3.8.7. Ierobežojumi Ätrai atsvaidzinÄÅ”anai materializÄtos skatos, izmantojot UNION ALL
MaterializÄti skati ar UNIONALL iestatiet operatora atbalstu REFRESHFAST iespÄja, ja ir izpildÄ«ti Å”Ädi nosacÄ«jumi:
DefinÄjoÅ”ajam vaicÄjumam ir jÄbÅ«t UNIONALL operators augstÄkÄ lÄ«menÄ«.
JÅ«su darbs IR Klientu apkalpoÅ”ana UNIONALL operatoru nevar iegult apakÅ”vaicÄjumÄ, ar vienu izÅÄmumu: The UNIONALL var bÅ«t apakÅ”vaicÄjumÄ FROM klauzula, ja definÄjoÅ”ais vaicÄjums ir Å”ÄdÄ formÄ SELECT * FROM (skatiet vai veiciet apakÅ”vaicÄjumu ar UNIONALL) kÄ Å”ajÄ piemÄrÄ:
CREATE VIEW view_with_unionall AS (ATLASÄŖT c.rowid crid, c.cust_id, 2 umarker NO klientiem c WHERE c.cust_last_name = 'Smith' UNION ALL SELECT c.rowid crid, c.cust_id, 3 umarker NO klientiem c WHERE c.cust_last "Džounss"); IZVEIDOT MATERIALIZÄTU SKATU unionall_inside_view_mv PÄC PIEPRASÄŖJUMA ÄTRI ATSVAIDZINÄT, KÄ IZVÄLÄTIES * NO view_with_unionall;
Å emiet vÄrÄ, ka skats view_with_unionall atbilst Ätras atsvaidzinÄÅ”anas prasÄ«bÄm.
Katrs vaicÄjumu bloks UNIONALL vaicÄjumam ir jÄatbilst prasÄ«bÄm par Ätri atsvaidzinoÅ”u materializÄtu skatu ar apkopojumiem vai Ätri atsvaidzinÄma materializÄta skata ar savienojumiem prasÄ«bÄm.
TabulÄs ir jÄizveido atbilstoÅ”i materializÄtÄ skata žurnÄli, kÄ nepiecieÅ”ams atbilstoÅ”ajam Ätri atsvaidzinÄmÄ materializÄtÄ skata veidam.
Å emiet vÄrÄ, ka Oracle datu bÄze pieļauj arÄ« atseviŔķas tabulas materializÄta skata Ä«paÅ”o gadÄ«jumu ar savienojumiem tikai tad, ja ROWID kolonna ir iekļauta SELECT sarakstÄ un materializÄtÄ skata žurnÄlÄ. Tas tiek parÄdÄ«ts skata definÄjoÅ”ajÄ vaicÄjumÄ view_with_unionall.
JÅ«su darbs IR Klientu apkalpoÅ”ana SELECT katra vaicÄjuma sarakstÄ jÄiekļauj a UNIONALL marÄ·ieris un UNIONALL katrÄ kolonnÄ ir jÄbÅ«t atŔķirÄ«gai konstantai skaitliskai vai virknes vÄrtÄ«bai UNIONALL filiÄle. TurklÄt marÄ·iera kolonnai ir jÄparÄdÄs tajÄ paÅ”Ä kÄrtas pozÄ«cijÄ SELECT katra vaicÄjuma bloka saraksts. SkatÄ«t "UNION ALL MarÄ·ieris un vaicÄjums pÄrrakstÄ«tĀ» lai iegÅ«tu vairÄk informÄcijas par UNIONALL marÄ·ieri.
Dažas funkcijas, piemÄram, ÄrÄjie savienojumi, tikai ievietojami apkopotie materializÄto skatu vaicÄjumi un attÄlÄs tabulas, netiek atbalstÄ«ti materializÄtiem skatiem ar UNIONALL. TomÄr Åemiet vÄrÄ, ka replicÄÅ”anÄ izmantotos materializÄtos skatus, kas nesatur savienojumus vai apkopojumus, var Ätri atsvaidzinÄt, kad UNIONALL vai tiek izmantotas attÄlÄs tabulas.
SaderÄ«bas inicializÄcijas parametram jÄbÅ«t iestatÄ«tam uz 9.2.0 vai augstÄku, lai izveidotu Ätri atsvaidzinÄmu materializÄtu skatu ar UNIONALL.
Negribu aizvainot Oracle fanus, bet, spriežot pÄc viÅu ierobežojumu saraksta, Ŕķiet, ka Å”is mehÄnisms ir rakstÄ«ts nevis vispÄrÄ«gÄ gadÄ«jumÄ, izmantojot kaut kÄdu modeli, bet gan tÅ«kstoÅ”iem indieÅ”u, kur katram tika dota iespÄja uzraksta savu zaru, un katrs darÄ«ja, ko varÄja.un darÄ«ja. Å Ä« mehÄnisma izmantoÅ”ana Ä«stai loÄ£ikai ir kÄ staigÄÅ”ana pa mÄ«nu lauku. JÅ«s varat iegÅ«t mÄ«nu jebkurÄ laikÄ, nospiežot kÄdu no acÄ«mredzamajiem ierobežojumiem. Tas, kÄ tas darbojas, ir arÄ« atseviŔķs jautÄjums, taÄu tas ir Ärpus Ŕī raksta darbÄ«bas jomas.
Microsoft SQL Server
Papildu prasības
Papildus SET opcijÄm un deterministisku funkciju prasÄ«bÄm ir jÄievÄro Å”Ädas prasÄ«bas:
LietotÄjs, kurÅ” izpilda CREATE INDEX jÄbÅ«t skata Ä«paÅ”niekam.
Kad veidojat indeksu, IGNORE_DUP_KEY opcijai jÄbÅ«t iestatÄ«tai uz OFF (noklusÄjuma iestatÄ«jums).
Uz tabulÄm jÄbÅ«t atsaucÄm ar divdaļīgiem nosaukumiem, shÄma.tabulas nosaukums skata definÄ«cijÄ.
SkatÄ norÄdÄ«tÄs lietotÄja definÄtÄs funkcijas ir jÄizveido, izmantojot WITH SCHEMABINDING variants.
Visas lietotÄja definÄtÄs funkcijas, uz kurÄm ir atsauce skatÄ, ir jÄatsauc ar divdaļīgiem nosaukumiem, ..
LietotÄja definÄtas funkcijas datu piekļuves rekvizÄ«tam ir jÄbÅ«t NO SQL, un ÄrÄjÄs piekļuves Ä«paÅ”umam jÄbÅ«t NO.
KopÄjÄs valodas izpildlaika (CLR) funkcijas var parÄdÄ«ties skata atlases sarakstÄ, taÄu tÄs nevar bÅ«t daļa no kopu indeksa atslÄgas definÄ«cijas. CLR funkcijas nevar parÄdÄ«ties skata klauzulÄ WHERE vai skata darbÄ«bas JOIN klauzulÄ ON.
Skata definÄ«cijÄ izmantotajÄm CLR funkcijÄm un CLR lietotÄja definÄto tipu metodÄm ir jÄbÅ«t iestatÄ«tÄm Ä«paŔībÄm, kÄ parÄdÄ«ts nÄkamajÄ tabulÄ.
īpaŔums
Piezīmes
DETERMINISTISKS = TRUE
Ir skaidri jÄnorÄda kÄ Microsoft .NET Framework metodes atribÅ«ts.
PRECÄŖZI = TRUE
Ir skaidri jÄnorÄda kÄ .NET Framework metodes atribÅ«ts.
DATU PIEKĻUVE = NAV SQL
Nosaka, iestatot DataAccess atribūtu DataAccessKind.None un SystemDataAccess atribūtu SystemDataAccessKind.None.
ÄRÄJÄ PIEKÄ»UVE = NÄ
Å is rekvizÄ«ts pÄc noklusÄjuma ir NO CLR rutÄ«nÄm.
Skats jÄizveido, izmantojot WITH SCHEMABINDING variants.
SkatÄ jÄatsaucas tikai uz bÄzes tabulÄm, kas atrodas tajÄ paÅ”Ä datu bÄzÄ kÄ skats. Skats nevar atsaukties uz citiem skatiem.
COUNT
ROWSET funkcijas (OPENDATASOURCE, OPENQUERY, OPENROWSET, UN OPENXML) OUTER pievienojas (LEFT, RIGHT, vai FULL)
AtvasinÄta tabula (definÄta, norÄdot a SELECT paziÅojums FROM klauzula)
PaŔapvienojas
Kolonnu norÄdÄ«Å”ana, izmantojot SELECT * or SELECT <table_name>.*
DISTINCT STDEV, STDEVP, VAR, VARP, vai AVG
KopÄjÄ tabulas izteiksme (CTE)
peldÄt1, teksts, ntext, attÄls, XML, vai failu straume kolonnas
ApakÅ”vaicÄjums OVER klauzula, kas ietver ranžÄÅ”anas vai apkopojuma loga funkcijas
Pilna teksta predikÄti (CONTAINS, FREETEXT) SUM funkcija, kas atsaucas uz nullÄjamu izteiksmi ORDER BY
CLR lietotÄja definÄta apkopoÅ”anas funkcija TOP CUBE, ROLLUP, vai GROUPING SETS UzÅÄmÄjiem
MIN, MAX UNION, EXCEPT, vai INTERSECT UzÅÄmÄjiem TABLESAMPLE
Tabulas mainīgie OUTER APPLY or CROSS APPLY PIVOT, UNPIVOT
Reti kolonnu komplekti
IekļautÄs (TVF) vai vairÄku priekÅ”rakstu tabulas vÄrtÄ«bas funkcijas (MSTVF) OFFSET
CHECKSUM_AGG
1 IndeksÄtajÄ skatÄ var bÅ«t peldÄt kolonnas; tomÄr Å”Ädas kolonnas nevar iekļaut klasterizÄtÄ indeksa atslÄgÄ.
If GROUP BY ir klÄt, VIEW definÄ«cijÄ ir jÄietver COUNT_BIG(*) un nedrÄ«kst saturÄt HAVING. Å is GROUP BY ierobežojumi attiecas tikai uz indeksÄtÄ skata definÄ«ciju. VaicÄjums izpildes plÄnÄ var izmantot indeksÄtu skatu, pat ja tas neatbilst Å”iem nosacÄ«jumiem GROUP BY ierobežojumi.
Ja skata definÄ«cija satur a GROUP BY klauzulu, unikÄlÄ klasterizÄtÄ indeksa atslÄga var atsaukties tikai uz kolonnÄm, kas norÄdÄ«tas GROUP BY klauzula.
Å eit ir skaidrs, ka indieÅ”i nebija iesaistÄ«ti, jo viÅi nolÄma to darÄ«t saskaÅÄ ar shÄmu āmÄs darÄ«sim maz, bet labiā. Tas ir, viÅiem ir vairÄk mÄ«nu uz lauka, bet to atraÅ”anÄs vieta ir pÄrredzamÄka. VisvairÄk neapmierinoÅ”ais ir Å”is ierobežojums:
SkatÄ jÄatsaucas tikai uz bÄzes tabulÄm, kas atrodas tajÄ paÅ”Ä datu bÄzÄ kÄ skats. Skats nevar atsaukties uz citiem skatiem.
MÅ«su terminoloÄ£ijÄ tas nozÄ«mÄ, ka funkcija nevar piekļūt citai materializÄtai funkcijai. Tas samazina visu ideoloÄ£iju jau paÅ”Ä sÄkumÄ.
TurklÄt Å”is ierobežojums (un tÄlÄk tekstÄ) ievÄrojami samazina lietoÅ”anas gadÄ«jumu skaitu:
COUNT
ROWSET funkcijas (OPENDATASOURCE, OPENQUERY, OPENROWSET, UN OPENXML) OUTER pievienojas (LEFT, RIGHT, vai FULL)
AtvasinÄta tabula (definÄta, norÄdot a SELECT paziÅojums FROM klauzula)
PaŔapvienojas
Kolonnu norÄdÄ«Å”ana, izmantojot SELECT * or SELECT <table_name>.*
DISTINCT STDEV, STDEVP, VAR, VARP, vai AVG
KopÄjÄ tabulas izteiksme (CTE)
peldÄt1, teksts, ntext, attÄls, XML, vai failu straume kolonnas
ApakÅ”vaicÄjums OVER klauzula, kas ietver ranžÄÅ”anas vai apkopojuma loga funkcijas
Pilna teksta predikÄti (CONTAINS, FREETEXT) SUM funkcija, kas atsaucas uz nullÄjamu izteiksmi ORDER BY
CLR lietotÄja definÄta apkopoÅ”anas funkcija TOP CUBE, ROLLUP, vai GROUPING SETS UzÅÄmÄjiem
MIN, MAX UNION, EXCEPT, vai INTERSECT UzÅÄmÄjiem TABLESAMPLE
Tabulas mainīgie OUTER APPLY or CROSS APPLY PIVOT, UNPIVOT
Reti kolonnu komplekti
IekļautÄs (TVF) vai vairÄku priekÅ”rakstu tabulas vÄrtÄ«bas funkcijas (MSTVF) OFFSET
CHECKSUM_AGG
ÄRÄJIE PIEVIENOJUMI, SAVIENÄŖBA, PASÅŖTÄŖJUMS un citi ir aizliegti. VarÄtu bÅ«t vieglÄk norÄdÄ«t, ko varÄtu izmantot, nevis to, ko nevar izmantot. Saraksts, iespÄjams, bÅ«tu daudz Ä«sÄks.
RezumÄjot: milzÄ«gs ierobežojumu kopums katrÄ (atzÄ«mÄsim komerciÄlo) DBVS salÄ«dzinÄjumÄ ar nevienu (izÅemot vienu loÄ£isku, nevis tehnisku) LGPL tehnoloÄ£ijÄ. TomÄr jÄatzÄ«mÄ, ka Ŕī mehÄnisma ievieÅ”ana relÄciju loÄ£ikÄ ir nedaudz grÅ«tÄka nekÄ aprakstÄ«tajÄ funkcionÄlajÄ loÄ£ikÄ.
IevieŔana
KÄ tas strÄdÄ? PostgreSQL tiek izmantots kÄ āvirtuÄlÄ maŔīnaā. IekÅ”pusÄ ir sarežģīts algoritms, kas veido vaicÄjumus. Å eit avots. Un ir ne tikai liels heiristikas kopums ar virkni ifs. TÄtad, ja jums ir pÄris mÄneÅ”i, lai studÄtu, jÅ«s varat mÄÄ£inÄt saprast arhitektÅ«ru.
Vai tas darbojas efektÄ«vi? Diezgan efektÄ«va. DiemžÄl to ir grÅ«ti pierÄdÄ«t. Varu tikai teikt, ka, ja Åem vÄrÄ tÅ«kstoÅ”iem vaicÄjumu, kas pastÄv lielajÄs lietojumprogrammÄs, tad vidÄji tie ir efektÄ«vÄki nekÄ laba izstrÄdÄtÄja vaicÄjumi. Izcils SQL programmÄtÄjs var efektÄ«vÄk uzrakstÄ«t jebkuru vaicÄjumu, bet ar tÅ«kstoÅ” vaicÄjumiem viÅam vienkÄrÅ”i nebÅ«s ne motivÄcijas, ne laika to darÄ«t. VienÄ«gais, ko tagad varu minÄt kÄ efektivitÄtes pierÄdÄ«jumu, ir tas, ka uz Ŕīs DBVS balstÄ«tÄs platformas darbojas vairÄki projekti. ERP sistÄmas, kurÄm ir tÅ«kstoÅ”iem dažÄdu MATERIALIZÄTU funkciju, ar tÅ«kstoÅ”iem lietotÄju un terabaitu datubÄzÄm ar simtiem miljonu ierakstu, kas darbojas parastÄ divu procesoru serverÄ«. TomÄr ikviens var pÄrbaudÄ«t/atspÄkot efektivitÄti, lejupielÄdÄjot platforma un PostgreSQL, ieslÄgts reÄ£istrÄt SQL vaicÄjumus un mÄÄ£inÄt mainÄ«t tur esoÅ”o loÄ£iku un datus.
NÄkamajos rakstos es runÄÅ”u arÄ« par to, kÄ varat iestatÄ«t funkciju ierobežojumus, strÄdÄt ar izmaiÅu sesijÄm un daudz ko citu.