
Eelnevas kirjeldasin andmebaasi kontseptsiooni ja rakendust, mis pÔhineb funktsioonidel, mitte tabelitel ja vÀliandmetel nagu relatsioonilistes andmebaasides. Seal on toodud palju nÀiteid, mis nÀitavad selle lÀhenemise eeliseid klassikalise ees. Paljud leidsid, et need olid piisavalt veenvad.
Selles artiklis nĂ€itan, kuidas selline kontseptsioon vĂ”imaldab kiiresti ja mugavalt tasakaalustada andmete kirjutamist ja lugemist andmebaasis ilma igasuguste muudatusteta töölogikas. Sarnast funktsionaalsust on proovitud rakendada kaasaegsetes kaubanduslikes andmebaasihaldussĂŒsteemides (eriti Oracle ja Microsoft SQL Server). Artikli lĂ”pus nĂ€itan, et sellel ei lĂ€inud just vĂ€ga hĂ€sti.
Kirjeldus
Nagu varasemalt, alustan nÀidetest parima arusaamise nimel. Oletame, et peame rakendama loogikat, mis tagastab osakondade nimekirja koos töötajate arvu ja nende kogupalga.
Funktsionaalses andmebaasis nÀeb see vÀlja jÀrgmiselt:
Klass Departement 'Osakond';
nimi 'Nimetus' = ANDMED STRING[100] (Departement);
CLASS Employee 'Töötaja';
department 'Osakond' = DATA Department (Employee);
salary 'Palk' = DATA NUMERIC[10,2] (Employee);
countEmployees 'Töötajate arv' (Department d) =Â
    GROUP SUM 1 IF department(Employee e) = d;
salarySum 'Kogupalk' (Department d) =Â
    GROUP SUM salary(Employee e) IF department(e) = d;
SELECT name(Department d), countEmployees(d), salarySum(d);
Selle pĂ€ringu tĂ€itmise keerukus igas andmebaasis on vĂ”rreldav O(töötajate arvuga), kuna selle arvutamiseks tuleb skaneerida kogu töötajate tabel ja seejĂ€rel rĂŒhmitada nad osakondade kaupa. Samuti tuleb arvestada vĂ€ikese lisandiga (arvame, et töötajaid on oluliselt rohkem kui osakondi) sĂ”ltuvalt valitud plaanist O(log töötajate arv) vĂ”i O(osakondade arv) rĂŒhmitamise ja muu kohta.
Selge, et teostuskulud vÔivad erinevates andmebaasides olla erinevad, kuid keerukus ei muutu kuidagi.
Esi rakenduses loob funktsionaalne andmebaas ĂŒhte alampĂ€ringut, mis arvutab vajalikud vÀÀrtused osakonna jĂ€rgi ja liidab seejĂ€rel osakondade tabeliga, et saada nimi. Siiski on iga funktsiooni deklareerimisel vĂ”imalik mÀÀrata spetsiaalne marker MATERIALIZED. SĂŒsteem loob automaatselt vastava vĂ€lja iga sellise funktsiooni jaoks. Funktsiooni vÀÀrtuse muutmisel muudetakse ka vĂ€lja vÀÀrtust samas tehingus. Funktsiooni kutsumisel pöördutakse juba eelnevalt arvutatud vĂ€lja poole.
Eriti kui mÀÀrata MATERIALIZED funktsioonide jaoks countEmployees ja salarySum, siis lisatakse osakondade loendi tabelisse kaks vĂ€lja, kuhu salvestatakse töötajate arv ja nende kogupalk. Iga töötaja, nende palga vĂ”i osakondade kuuluvuse muutumisel muudab sĂŒsteem automaatselt nende vĂ€ljade vÀÀrtusi. Ălaltoodud pĂ€ring pöördub otse nende vĂ€ljade poole ja tĂ€idetakse O(osakondade arv).
Millised on piirangud? Ainult ĂŒks: sellisel funktsioonil peab olema lĂ”plik sisendvÀÀrtuste arv, mille jaoks on selle vÀÀrtus mÀÀratud. Vastasel juhul oleks vĂ”imatu koostada tabelit, mis salvestab kĂ”ik tema vÀÀrtused, kuna ei saa olla tabelit, kus on lĂ”pmatu arv ridu.
NĂ€ide:
employeesCount 'Töötajate arv palgaga > N' (Department d, NUMERIC[10,2] N) =Â
    GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;
See funktsioon on mÀÀratud lĂ”pmatu arvu vÀÀrtustele, nĂ€iteks sobib iga negatiivne vÀÀrtus. Seega ei saa sellele mÀÀrata MATERIALIZED. Seega on see loogiline, mitte tehniline piirang (st mitte sellepĂ€rast, et me ei suudaks seda realiseerida). Muus osas pole mingeid piiranguid. Saab kasutada rĂŒhmitamisi, sorteerimisi, AND ja OR, PARTITION, rekursioone jne.
NĂ€iteks eelmise artikli ĂŒlesandes 2.2 saab mÀÀrata MATERIALIZED mĂ”lema funktsiooni jaoks:
ostetud 'Ostis' (Klient c, Toode p, KOGUS y) =Â
    RĂHM SUM sum(Detaail d) KUIÂ
        klient(keerake(d)) = c JAÂ
        toode(d) = p JAÂ
        vÀlja vÔttaAasta(date(keerake(d))) = y MATERIALISEERITUD;
hinnang 'Hinnang' (Klient c, Toode p, KOGUS y) =Â
    PARTITSIOON SUM 1 KORDA MITTE KUI ostetud(c, p, y), p KLIENDI, y MATERIALISEERITUD;
VALI kontaktNimi(Klient c), nimi(Toode p) KUIDAS hinnang(c, p, 1997) < 3;
SĂŒsteem loob ise ĂŒhe tabeli tĂŒĂŒpide vĂ”tmetega Klient, Toode ja INTEGER, lisab sinna kaks vĂ€lja ja uuendab nende vÀÀrtusi igasuguste muudatuste korral. Edasiste pĂ€ringute puhul nende funktsioonide osas ei toimu nende arvutamist, vaid loetakse vastavatest vĂ€ljades vÀÀrtusi.
Selle mehhanismi abil on vÔimalik nÀiteks loobuda rekursioonidest (CTE) pÀringutes. NÀiteks vaatleme gruppe, mis moodustavad puu child/parent suhte kaudu (igal grupil on viide oma vanemale):
vanem = ANDME Grupp (RĂŒhm);
Funktsionaalsetes andmebaasides saab rekursiivse loogika mÀÀratleda jÀrgmiselt:
tase (RĂŒhma laps, RĂŒhma vanem) = REKURSIOON 1l KUI laps ON RĂŒhm JA vanem == laps
                                                             SAMM 2l KUI vanem == vanem($vanem);
isVanem (RĂŒhma laps, RĂŒhma vanem) = TĂENE KUI tase(laps, vanem) MATERJALISEERITUD;
Kuna funktsioonile isParent on mÀÀratud MATERIALIZED, siis selle jaoks luuakse tabel kahe vĂ”tmega (grupiga), kus vĂ€li isParent on tĂ”ene ainult siis, kui esimene vĂ”ti on teise jĂ€reltulija. Selle tabeli ridade arv on vĂ”rdne gruppide arvu ja puu keskmise sĂŒgavuse korrutisega. Kui on vaja nĂ€iteks arvutada teatud grupi jĂ€reltulijate arvu, saab sellele funktsioonile viidata:
lasteArv (Grupi g) = GRUPI SUM 1 KUI isVanem(Grupi laps, g);
SQL-pÀringus ei ole CTE-d. Selle asemel on olemas lihtne GROUP BY.
Selle mehhanismi abil on samuti lihtne vajadusel andmebaasi denormaliseerida:
Klass Tellimus 'Tellimus';
kuupÀev 'KuupÀev' = DATA DATE (Tellimus);
CLASS OrderDetail 'Tellimuse rida';
order 'Tellimus' = DATA Order (OrderDetail);
date 'KuupÀev' (OrderDetail d) = date(order(d)) MATERIALIZED INDEXED;
Kasutades funktsiooni date tellimuse read loetakse tabelist, kus on vĂ€li, millel on indeks. Kui tellimuse kuupĂ€eva muudetakse, arvutab sĂŒsteem automaatselt denormaliseeritud kuupĂ€eva uuesti.
Eelised
Milliseks on kogu see mehhanism vajalik? Klassikalistes andmebaasides, ilma pĂ€ringute ĂŒmberkirjutamiseta, saavad arendajad vĂ”i DBA-d vaid indekseid muuta, statistikat mÀÀrata ja suunata pĂ€ringute planeerijat, kuidas neid teostada (HINTâe on ainult kommertsandmebaasides). ĂkskĂ”ik kui palju nad vaeva nĂ€evad, ei saa nad esimest pĂ€ringut artiklis tĂ€ita arvu vĂ”rra O (osakondade arv) ilma pĂ€ringute muutmise ja triggerite kirjutamiseta. Kuid ettepanekus, mida esitatakse, ei pea arendamise kĂ€igus muretsema andmete sĂ€ilitamise struktuuri ja selle ĂŒle, milliseid agregaatfunktsioone kasutada. Seda kĂ”ike saab rahulikult muudatusi teha juba töö kĂ€igus.
Praktikas nĂ€eb see vĂ€lja jĂ€rgmine. MĂ”ned inimesed arendavad otse ĂŒlesande pĂ”hjal loogikat. Nad ei mĂ”ista ei algoritme ja nende keerukust, ei tĂ€itmisplaane, ei join-tĂŒĂŒpe, ega ĂŒhtegi muud tehnilist aspekti. Need inimesed on pigem Ă€rianalĂŒĂŒtikud kui arendajad. SeejĂ€rel lĂ€hevad kĂ”ik need asjad testimisele vĂ”i kasutusse. LĂŒlitatakse sisse pikaajaliste pĂ€ringute logimine. Kui leitakse pikk pĂ€ring, siis otsustab selle ĂŒle juba teised inimesed (tehnilisemad â sisuliselt DBA-d), et aktiveerida MATERIALIZED mingi vahefunktsiooni jaoks. Sellega aeglustub veidi kirjutamine (sest on vajalik lisavĂ€lja vĂ€rskendamine tehingus). Kuid see kiirendab oluliselt mitte ainult seda pĂ€ringut, vaid ka kĂ”iki teisi, mis kasutavad seda funktsiooni. Otsustamine, milline funktsioon just materialiseerida, on suhteliselt lihtne. Kaks peamist parameetrit: vĂ”imalike sisendvÀÀrtuste arv (just nii palju kirjeid on vastavas tabelis) ja kui sageli seda kasutatakse teistes funktsioonides.
Analoogid
Kaasaegsetes kommertslikes andmebaasihaldussĂŒsteemides on sarnased mehhanismid: MATERIALIZED VIEW FAST REFRESH (Oracle) ja INDEXED VIEW (Microsoft SQL Server). PostgreSQL-s ei oska MATERIALIZED VIEW vĂ€rskendust teostada tehingus, vaid ainult nĂ”udmisel (ja veel vĂ€ga ranged piirangud), seega seda ei arvestata. Kuid nendel on mitmeid probleeme, mis piiravad oluliselt nende kasutust.
Esiteks, materialiseerimine on lubatud ainult siis, kui on juba loodud tavaline VIEW. Vastasel juhul tuleb ĂŒle kirjutada kĂ”ik muud pĂ€ringud, et pöörduda uue loodud vaate poole, et kasutada seda materialiseerimist. VĂ”i jĂ€tta kĂ”ik nii, nagu on, kuid see on vĂ€hemalt ebaefektiivne, kui on olemas teatud juba ette arvutatud andmed, kuid paljusid pĂ€ringuid ei kasuta neid alati, vaid arvutavad uuesti.
Teiseks, neil on palju piiranguid:
Oracle
5.3.8.4 Ăldised piirangud kiireks vĂ€rskendamiseks
Materialiseeritud vaate mÀÀratlev pÀring on jÀrgmistele piirangutele allutatud:
- Materialiseeritud vaade ei tohi sisaldada viiteid mitte-korratavatele avaldustele nagu
SYSDATEjaROWNUM.- Materialiseeritud vaade ei tohi sisaldada viiteid
RAWvĂ”iLONGRAWandmetĂŒĂŒpidele.- See ei tohi sisaldada
SELECTloendi alampĂ€ringut.- See ei tohi sisaldada analĂŒĂŒtilisi funktsioone (nĂ€iteks
RANK) lauses.SELECTSee ei tohi viidata tabelile, millel on mÀÀratud- XMLIndex
indeks.MODEL- See ei tohi sisaldada
HAVINGSee ei tohi viidata tabelile, millel on mÀÀratud- See ei tohi sisaldada
klausel alampĂ€ringuga.See ei tohi sisaldada pesakĂŒsimusi, millel on- ANY
ALL,, vÔiNOTEXISTSEXISTS.- See ei tohi sisaldada
[START WITH âŠ] ĂHENDAGE BYSee ei tohi viidata tabelile, millel on mÀÀratud- See ei tohi sisaldada mitut detailtabelit erinevates kohtades.
KASCOMMITmaterjaliseeritud vaated ei tohi omada kauguses detailtabeleid.- Sisemised materjaliseeritud vaated peavad sisaldama liitumist vÔi agregaati.
- Materjaliseeritud liitumisvaated ja materjaliseeritud agregaativaated koos
GRUPPIDAKOHESklausel ei tohi valida indeksiga korraldatud tabelit.5.3.8.5 Kiire vÀrskenduse piirangud materjaliseeritud vaadete suhtes, millel on ainult liidud
Materjaliseeritud vaadete mÀÀratlemiseks, millel on ainult liidud ja ei sisaldada agregaate, kehtivad jÀrgmised piirangud kiire vÀrskendamise osas:
- KÔik piirangud ««.
- Nad ei tohi sisaldada
GRUPPIDAKOHESklausuure ega agregaate.- Tabelite ridade ID-d
KUSTloend peab ilmumaSELECTpÀringu nimekirja.- Materjaliseeritud vaate logid peavad eksisteerima kÔigi aluste tabelite ridade ID-dega
KUSTpĂ€ringu nimekirja.- Te ei saa luua kiiresti vĂ€rskendatavat materjaliseeritud vaadet mitmest tabelist, kus on lihtsad liidud, mis sisaldavad objekti tĂŒĂŒpi veergu
SELECTlausendis.Samuti ei ole valitud vÀrskendamismeetod optimaalselt efektiivne, kui:
- MÀÀratlemiseks kasutatav pĂ€ring kasutab vĂ€list liitu, mis kĂ€itub nagu sisemine liit. Kui mÀÀratlev pĂ€ring sisaldab sellist liitu, kaaluge mÀÀratleva pĂ€ringu ĂŒmbersĂ”nastamist, et see sisaldaks sisemist liitu.
- Materjaliseeritud vaate
SELECTloend sisaldab vÀljendeid veergudest, mis pÀrinevad mitmest tabelist.5.3.8.6 Kiire vÀrskenduse piirangud materjaliseeritud vaadete suhtes, millel on agregaadid
Materjaliseeritud vaade mÀÀratleb pÀringud, millel on agregaadid vÔi liidud, kehtivad jÀrgmised piirangud kiire vÀrskendamise osas:
- KÔik piirangud ««.
Kiire vÀrskendus on toetatud mÔlema jaoks
KASCOMMITjaKASNĂUDMINEmaterjaliseeritud vaated, siiski kehtivad jĂ€rgmised piirangud:
- KÔik tabelid materjaliseeritud vaates peavad omama materjaliseeritud vaate logisid, ja materjaliseeritud vaate logid peavad:
- Sisaldama kÔiki veerge tabelist, mis on viidatud materjaliseeritud vaates.
- Osutama
ROWIDjaKATMAUUTEVĂĂRTUSTE.- Osutama
JĂUDklausus, kui tabelil on oodata sisestuste/otsese laadimise, kustutamise ja vĂ€rskenduste segu.- Ainult
SUMMA,LOEND,AVG,STDDEV,VARIANTS,MINjaMAXtoetatakse kiire vÀrskenduse jaoks.LOEND(*)peab olema mÀÀratud.- Agregaadifunktsioonid peavad toimuma ainult vÀljendi vÀliskihina. See tÀhendab, et agregaadid, nagu
AVG(AVG(x))vÔiAVG(x)+AVG(x)ei ole lubatud.- Iga agregaadi puhul nagu
AVG(expr), vastavCOUNT(expr)peab olema olemas. Oracle soovitab, etSUM(expr)peaks olema mÀÀratud.- Kui
VARIANTS(expr)vÔiSTDDEV(expr) on mÀÀratud,COUNT(expr)jaSUM(expr)peab olema mÀÀratud. Oracle soovitab, etSUM(expr *expr)peaks olema mÀÀratud.- Materjaliseeritud vaate
SELECTveerg mÀÀratlemise pĂ€ringus ei tohi olla keeruline vĂ€ljend, mis sisaldab veerge mitmest alustan tabelist. Ăks vĂ”imalik tööstuslahendus on kasutada sisemist materjaliseeritud vaadet.- Materjaliseeritud vaate
SELECTloend peab sisaldama kĂ”ikiGRUPPIDAKOHESveerge.- Materjaliseeritud vaade ei pĂ”hine ĂŒhel vĂ”i mitmel kaugtabelil.
- Kui kasutate
CHARandmetĂŒĂŒpi materjaliseeritud vaate logi filterveergudes, peavad meistri koha ja materjaliseeritud vaate sĂŒmbolikoodid olema samad.- Kui materjaliseeritud vaadel on ĂŒks jĂ€rgmistest, siis kiire vĂ€rskendamine on toetatud ainult konventsionaalsete DML sisestuste ja otse laadimiste korral.
- Materjaliseeritud vaated, millel on
MINvÔiMAXagregaadid- Materjaliseeritud vaated, millel on
SUM(expr)kuid ei oleCOUNT(expr)- Materjaliseeritud vaated ilma
LOEND(*)Sellist materjaliseeritud vaadet nimetatakse ainult sisestamismaterjaliseeritud vaateks.
- Materjaliseeritud vaade, millel on
MAXvÔiMINon kiiresti vÀrskendatav pÀrast kustutamist vÔi segatud DML-lauseid, kui sellel ei oleKUSSee ei tohi viidata tabelile, millel on mÀÀratud
Maksimalne/minimaalne kiire vÀrskendus pÀrast kustutamist vÔi segatud DML ei kÀitu sama moodi nagu ainult sisestamise puhul. See kustutab ja arvutab uuesti maksimaalsed/minimaalsed vÀÀrtused mÔjutatud gruppide jaoks. Te peate olema teadlik selle toimivuse mÔjust.- Materjaliseeritud vaated, millel on nimetatud vaated vÔi alampÀringud lauses
KUSTvĂ”ivad olla kiiresti vĂ€rskendatavad, tingimusel et vaated on tĂ€ielikult ĂŒhendatud. Teave selle kohta, millised vaated saavad ĂŒhendatud, vaadake .- Kui puuduvad vĂ€list liidud, vĂ”ite olla arengulised valikud ja liidud.
KUSSee ei tohi viidata tabelile, millel on mÀÀratud- Materjaliseeritud agregaadivaated koos vĂ€list ĂŒhendustega on kiirelt vĂ€rskendatavad pĂ€rast tavalisi DML ja otselaadimisi, tingimusel et ainult vĂ€listabelit on muudetud. Samuti peavad ainulaadsed piirangud olema olemas sisemise ĂŒhendustabeli ĂŒhendusveergude jaoks. Kui on olemas vĂ€lishoid, peavad kĂ”ik ĂŒhendused olema ĂŒhendatud
JAja peavad kasutama vÔrdsuse (=) operaatorit.- Materjaliseeritud vaadete puhul, millel on
KUBE,ROLLUP, grupivÀlja seeriate vÔi nende kokkuliitmiste puhul kehtivad jÀrgmised piirangud:
- Materjaliseeritud vaate
SELECTloendis peaks olema grupeerimise eristaja, mis vĂ”ib olla kasGROUPING_IDfunktsioon kĂ”ikideGRUPPIDAKOHESavaldiste vĂ”iGROUPINGfunktsioonide puhul, ĂŒks igaĂŒhe jaoksGRUPPIDAKOHESavaldis. NĂ€iteks, kuiGRUPPIDAKOHESmaterjaliseeritud vaate klauses on «GRUPPIDAKOHESKUBE(a, b)«, peaks loendis olema kas «SELECTGROUPING_ID(a, b)» vĂ”i «GROUPING(a)GROUPING(b)JA» et materjaliseeritud vaade oleks kiiresti vĂ€rskendatav.ei tohi pĂ”hjustada mingeid dubleeritud grupeerimisi. NĂ€iteks, «GRUPPIDAKOHESGROUP BY a, ROLLUP(a, b)» ei ole kiiresti vĂ€rskendatav, kuna see pĂ”hjustab dubleeritud grupeerimisi «(a), (a, b), JA (a)5.3.8.7 Kiire vĂ€rskenduse piirangud materjaliseeritud vaadetele, millel on UNION ALL«.Materjaliseeritud vaated, millel on
UNION
kogumi operaator, toetavad, vĂ”iVĂRSKENDUSKIIREvalikut, kui jĂ€rgmised tingimused on tĂ€idetud:MÀÀrava pĂ€ringu tipus peab olema
- operaator.
kogumi operaator, toetavad, vĂ”ioperaatorit ei tohi sĂŒgavale pĂ€ringusseEmbedida, vĂ€lja arvatud ĂŒks erand:Materjaliseeritud vaate
kogumi operaator, toetavad, vĂ”ivĂ”ib olla alampĂ€ringuskogumi operaator, toetavad, vĂ”iklauses, tingimusel et mÀÀrav pĂ€ring on vormisKUSTSELECT * FROM(vaade vĂ”i alampĂ€ring koos) nagu allolevas nĂ€ites:kogumi operaator, toetavad, vĂ”iLOO VAATE view_with_unionall AS (VALI c.rowid crid, c.cust_id, 2 umarker FROM customers c KUS c.cust_last_name = 'Smith' UNION ALL VALI c.rowid crid, c.cust_id, 3 umarker KLIENTID c KUS c.cust_last_name = 'Jones');LOO MATERJALISEERITUD VAATE unionall_inside_view_mv VĂRSKENDUS KIIRE NĂUDMISEL NAGU VALI * FROM view_with_unionall;Pange tĂ€hele, et vaadeview_with_unionall
rahuldab kiire vĂ€rskenduse nĂ”udeid.Iga pĂ€ringu plokk peaks rahuldama materjaliseeritud vaate kiire vĂ€rskenduse nĂ”udeid agregaatide vĂ”i kiire vĂ€rskenduse nĂ”udeid ĂŒhendustega.- Asjakohased materjaliseeritud vaate logid peavad olema loodud tabelite jaoks, nagu on nĂ”utud vastava tĂŒĂŒbi kiire vĂ€rskendusega materjaliseeritud vaate jaoks.
kogumi operaator, toetavad, vĂ”iPange tĂ€hele, et Oracle Database lubab ka erijuhtume, kus on olemas ainult ĂŒks tabeli materjaliseeritud vaade koos ĂŒhendustega, tingimusel etveerg on sisaldatud
loendis ja materjaliseeritud vaate logis. See on nÀidatud vaate mÀÀrava pÀringuROWIDloend sees olev pÀring peab sisaldamaSELECTmÀrker, ja veerg peab olema igasrahuldab kiire vÀrskenduse nÔudeid..- Materjaliseeritud vaate
SELECTharude eristamiseks ĂŒksikasjalik alates logisid. Edasi, mĂ€rker veerg peab ilmuma igasuguses ortoossaas iga kĂŒsimuses. Vaadake «kogumi operaator, toetavad, vĂ”iUNION ALL Marker ja PĂ€ringu Ămberkirjutaminekogumi operaator, toetavad, vĂ”i» rohkem teavet mĂ€rkerite kohta.kogumi operaator, toetavad, vĂ”iMĂ”ned funktsioonid, nagu vĂ€lised ĂŒhendused, ainult sisestamise agregaatide materjaliseeritud vaate pĂ€ringud ja kaugmootorid ei ole toetatud materjaliseeritud vaadetesSELECT. Pange tĂ€hele, et materjaliseeritud vaated, mida kasutatakse replikatsioonis, mis ei sisalda ĂŒhendusi vĂ”i agregaate, vĂ”ivad olla kiiresti vĂ€rskendatud, kuiĂhildav algparameeter peab olema seatud 9.2.0 vĂ”i kĂ”rgemale, et luua kiiresti vĂ€rskendatav materjaliseeritud vaate.kogumi operaator, toetavad, vĂ”imĂ€rgid.- MĂ”ned funktsioonid, nagu vĂ€limised liitmisoperatsioonid, ainult sisestatavakujundistevaade pĂ€ringud ja kaugfailid, ei ole toetatud materjaliseeritud vaadete jaoks, millel on
kogumi operaator, toetavad, vĂ”i. TĂ€helepanu, et materjaliseeritud vaated, mida kasutatakse replikatsioonis, milles ei ole ĂŒhendusi ega kokkuvĂ”tteid, saavad kiirelt vĂ€rskendatavaks, kuikogumi operaator, toetavad, vĂ”ivĂ”i kaugfailid on kasutusel.- Ăhilduvuse kĂ€ivitamise parameeter peab olema seadistatud 9.2.0 vĂ”i kĂ”rgemale, et luua kiiresti vĂ€rskendatav materjaliseeritud vaade, millel on
kogumi operaator, toetavad, vÔi.
Ma ei taha Oracle'i fĂ€nne solvata, kuid arvestades nende piirangute loetelu, jÀÀb mulje, et see mehhanism on kirjutatud mitte ĂŒldise juhtumi jaoks, kasutades mingit mudelit, vaid kĂŒmnete miinuste, kus igale isikule anti vĂ”imalus kirjutada oma haru, ja igaĂŒks neist tegi, mis suutis. Selle mehhanismi kasutamine reaalses loogikas on nagu minev minevikus ei jÀÀdud, juhul kui satud ĂŒhele ebamugavale piirangule. Kuidas see töötab â on ka eraldi teema, aga see jÀÀb selle artikli raamesse.
Microsoft SQL Server
Lisatingimused
Lisaks SET-i valikutele ja mÀÀratletud funktsioonide nÔuetele peavad olema tÀidetud jÀrgmised nÔuded:
- Kasutaja, kes teostab
CREATE INDEXpeab olema vaate omanik.- Kui loote indeksi, peab
IGNORE_DUP_KEYvalik olema seadistatud OFF-ks (vaikevÀÀrtus).- Tabeleid tuleb viidata kaheosaliste nimedega, schema.tablename vaate mÀÀratlemises.
- Kasutaja mÀÀratletud funktsioonid, mida vaates viidatakse, peavad olema loodud kasutades
WITH SCHEMABINDINGvalikut.- Iga kasutaja mÀÀratletud funktsioon, mida vaates viidatakse, peab olema viidatud kaheosaliste nimedega, <schema>.<function>.
- Kasutaja mÀÀratletud funktsiooni andmete juurdepÀÀsu omadus peab olema
NO SQL, ja vĂ€list juurdepÀÀsu omadus peab olemaNO.- Ăhise keele ajakava (CLR) funktsioonid vĂ”ivad ilmuda vaate valikute loendis, kuid ei saa olla osa klastrisse indeksivĂ”ti mÀÀratlemise kohta. CLR funktsioonid ei saa ilmneda vaate WHERE klauslis ega JOIN operatsiooni ON klauslis.
- CLR funktsioonid ja CLR kasutaja mÀÀratletud tĂŒĂŒpide meetodid, mida kasutatakse vaate mÀÀratlemisel, peavad olema seadistatud nagu nĂ€idatud jĂ€rgmises tabelis.
Omadus
MĂ€rkusDETERMINISTIC = TRUE
Peab olema deklaratsioonina mÀrgitud Microsoft .NET Framework meetodi atribuudiks.PRECISE = TRUE
Peab olema deklaratsioonina mÀrgitud .NET Framework meetodi atribuudiks.DATA ACCESS = NO SQL
MÀÀratakse, seadistades DataAccess atribuudi vÀÀrtuseks DataAccessKind.None ja SystemDataAccess atribuudi vÀÀrtuseks SystemDataAccessKind.None.EXTERNAL ACCESS = NO
See omadus on vaikevÀÀrtusena NO CLR rutiinide jaoks.- Vaade peab olema loodud kasutades
WITH SCHEMABINDINGvalikut.- Vaade peab viitama ainult aluskaartidele, mis asuvad sama andmebaasi sees kui vaade. Vaade ei saa viidata teistele vaadetele.
- Vaate mÀÀratlemise SELECT lauses ei tohi sisaldada jÀrgmisi Transact-SQL elemente:
LOEND
ROWSET-funktsioonid (OPENDATASOURCE,OPENQUERY,OPENROWSET, JAOPENXML)
VĂLJASliitumised (VASAK,PAREMNOTTĂIELIK)Tuletatud tabel (mÀÀratletud, mÀÀrates otse
SELECTlausesse)KUSTIshalud
MÀÀratleda veerge, kasutades
SELECT *SELECT <table_name>.*vÔiDISTINCT
STDEV
STDEVP,VAR,VARP,Ăksik tabeli vĂ€ljund (CTE)NOTAVG
floattekst1, ntext, XML, image, filestreamNOT veergudest AlamkĂŒsimus
ĂLE
lausest, mis sisaldab jÀrjestamis- vÔi agregaatakna funktsiooneTÀisteksti mÀÀratlused (CONTAINS
FREETEXT,funktsioon, mis viitab nullitavale vÀljendile)
SUMMAKORRALDA BY
CLR kasutaja mÀÀratletud agregaatfunktsioonTOP
GRUPP IMESED
KUBE,ROLLUPNOToperaatoridERINEVUS
MIN,MAX
kogumi operaator, toetavad,INTERSECTNOTTABLESAMPLEERINEVUS
Tabeli muutujaVĂLJAS KASUTA
RISTI KASUTAvÔiPIVOT
UNPIVOT,Sparsse veergude komplektidInline (TVF) vÔi mitme avaldise tabeli vÀÀrtuse funktsioonid (MSTVF)
OFFSET
CHECKSUM_AGG
1 Indekseeritud vaade vÔib sisaldadaveerge; kuid selliseid veerge ei saa lisada klastrisse indeksivÔti. tekst GRUPP BY
- Kui
on olemas, vaate mÀÀratlemine peab sisaldamaCOUNT_BIG(*)ja ei tohi sisaldada. Needklausel alampĂ€ringuga.piirangud kehtivad ainult indekseeritud vaate mÀÀratlemise kohta. KĂŒsitav saab kasutada indekseeritud vaadet oma kĂ€itamisplaanis, isegi kui see ei vasta selleleon olemas, vaate mÀÀratlemine peab sisaldamapiirangud.on olemas, vaate mÀÀratlemine peab sisaldamaKui vaate mÀÀratlemine sisaldab a- Kui vaate mÀÀratlemine sisaldab
on olemas, vaate mÀÀratlemine peab sisaldamatingimus, ainulaadse klastriga indeksi vÔti saab viidata ainult mÀÀratud veergudeleon olemas, vaate mÀÀratlemine peab sisaldamaSee ei tohi viidata tabelile, millel on mÀÀratud
Siit on nĂ€ha, et indusi ei paelunud, kuna nad otsustasid teha skeemi âteeme vĂ€he, aga hĂ€stiâ. See tĂ€hendab, et neil on vĂ€ljal rohkem miine, kuid nende paigutus on selgem. KĂ”ige rohkem hĂ€irib see piirang:
Vaade peab viitama ainult aluskaartidele, mis asuvad sama andmebaasi sees kui vaade. Vaade ei saa viidata teistele vaadetele.
Meie terminoloogias tÀhendab see, et funktsioon ei saa viidata teisele materialiseeritud funktsioonile. See peab kogu ideoloogia juureni.
Samuti vÀhendab see piirang (ja edasi tekstis) kasutusvÔimalusi vÀga palju:
Vaate mÀÀratlemise SELECT lauses ei tohi sisaldada jÀrgmisi Transact-SQL elemente:
LOEND
ROWSET-funktsioonid (OPENDATASOURCE,OPENQUERY,OPENROWSET, JAOPENXML)
VĂLJASliitumised (VASAK,PAREMNOTTĂIELIK)Tuletatud tabel (mÀÀratletud, mÀÀrates otse
SELECTlausesse)KUSTIshalud
MÀÀratleda veerge, kasutades
SELECT *SELECT <table_name>.*vÔiDISTINCT
STDEV
STDEVP,VAR,VARP,Ăksik tabeli vĂ€ljund (CTE)NOTAVG
floattekst1, ntext, XML, image, filestreamNOT veergudest AlamkĂŒsimus
ĂLE
lausest, mis sisaldab jÀrjestamis- vÔi agregaatakna funktsiooneTÀisteksti mÀÀratlused (CONTAINS
FREETEXT,funktsioon, mis viitab nullitavale vÀljendile)
SUMMAKORRALDA BY
CLR kasutaja mÀÀratletud agregaatfunktsioonTOP
GRUPP IMESED
KUBE,ROLLUPNOToperaatoridERINEVUS
MIN,MAX
kogumi operaator, toetavad,INTERSECTNOTTABLESAMPLEERINEVUS
Tabeli muutujaVĂLJAS KASUTA
RISTI KASUTAvÔiPIVOT
UNPIVOT,Sparsse veergude komplektidInline (TVF) vÔi mitme avaldise tabeli vÀÀrtuse funktsioonid (MSTVF)
OFFSET
CHECKSUM_AGG
1 Indekseeritud vaade vÔib sisaldada
OUTER JOINS, UNION, ORDER BY ja muud on keelatud. VĂ”ib-olla oleks lihtsam öelda, mida vĂ”ib kasutada, kui see, mida ei saa. Nimekiri oleks tĂ”enĂ€oliselt palju lĂŒhem.
KokkuvĂ”tteks: tohutu hulk piiranguid igas (mĂ€rgin kommertslikus) andmebaasis vs mitte mingeid (vĂ€lja arvatud ĂŒks loogiline, mitte tehniline) LGPL tehnoloogias. Siiski tuleb mĂ€rkida, et selle mehhanismi rakendamine relatsioonilises loogikas on veidi keerulisem kui kirjeldatud funktsionaalses.
Rakendamine
Kuidas see töötab? âVirtuaalse masinanaâ kasutatakse PostgreSQL-i. Seal sees on keeruline algoritm, mis tegeleb pĂ€ringute koostamisega. Siit . Ja seal ei ole lihtsalt suur hulk heurstikaid koos hunniku if-idega. Nii et kui on paar kuud aega uurimiseks, siis vĂ”ite proovida aru saada arhitektuurist.
Kas see töötab tÔhusalt? Piisavalt tÔhusalt. Kahjuks on seda raske tÔestada. VÔin öelda, et kui vaadata tuhandeid pÀringuid, mis on suurtes rakendustes, siis keskmiselt on need efektiivsemad kui hea arendaja katsetused. SuurepÀrane SQL-programmeerija vÔib kirjutada mistahes pÀringu efektiivsemalt, kuid tuhande pÀringu puhul pole tal lihtsalt motivatsiooni ega aega seda teha. Ainus, mida ma praegu tÔhususe tÔestamiseks tuua saan, on see, et selle andmebaasi platvormile rajatud töökohad töötavad , kus on tuhandeid erinevaid MATERIALIZED funktsioone, tuhandete kasutajatega ja terabaidiste andmebaasidega, kus on sadu millioneid kirjeid, töötades tavalisel kahetuumalisel serveril. Siiski vÔib iga soovija kontrollida/keelata efektiivsust, laadides alla ja PostgreSQL, SQL-pÀringute logimise ja proovides seal juhtida loogikat ja andmeid.
JÀrgmistes artiklites rÀÀgin ka, kuidas seadistada piiranguid funktsioonidele, töötada seanssidega ja palju muud.
Allikas: habr.com
