
Eelmises osas Olen kirjeldanud andmebaasi kontseptsiooni ja rakendust, mis pÔhinevad funktsioonidel, mitte tabelitel ja vÀljadest nagu suheline andmebaas. Toodud on palju nÀiteid, mis demonstreerivad sellise lÀhenemise eeliseid klassikalise ees. Paljud pidasid neid piisavalt veenvateks.
Selles artiklis nĂ€itan, kuidas selline kontseptsioon vĂ”imaldab kiiresti ja mugavalt tasakaalustada andmebaasi kirjutamist ja lugemist ilma igasuguste muudatusteta töölogikas. Sarnast funktsionaalsust on pĂŒĂŒdnud rakendada tĂ€napĂ€evased kaubanduslikud andmebaasisĂŒsteemid (eriti Oracle ja Microsoft SQL Server). Artikli lĂ”pus nĂ€itan, kuidas neil see Ă”nnestus, Ă”rnalt öeldes, mitte eriti hĂ€sti.
Kirjeldus
Nagu eelnevalt, parima arusaamise jaoks alustan kirjeldust nÀidetega. Oletame, et peame rakendama loogikat, mis tagastab osakondade nimekirja nende töötajate arvu ja kogupalkadega.
Funktsionaalses andmebaasis nÀeks see vÀlja jÀrgmiselt:
CLASS Department âOsakondâ;
name âNimiâ = DATA STRING[100] (Osakond);
CLASS Employee 'Töötaja';
department 'Osakond' = DATA Department (Employee);
salary 'Palk' = DATA NUMERIC[10,2] (Employee);
countEmployees 'Töötajate arv' (Department d) =Â
    GRUPP SUM 1 KUI osakond (Töötaja e) = d;
palgaSum 'Kogupalga' (Osakond d) =Â
    GRUPP SUM palk (Töötaja e) KUI osakond (e) = d;
VALI nimi (Osakond d), töötajate arv (d), palgaSum (d);
Selle pĂ€ringu tĂ€itmise keerukus igas andmebaasis on ekvivalentne O(töötajate arv), kuna selle arvutamise jaoks tuleb skaneerida kogu töötajate tabelit ning seejĂ€rel rĂŒhmitada nad osakondade kaupa. Samuti tuleb arvesse vĂ”tta natuke (arvestame, et töötajaid on palju rohkem kui osakondi) lisa sĂ”ltuvalt valitud plaanist O(log töötajate arv) vĂ”i O(osakondade arv) rĂŒhmitamise ja muude tegevuste jaoks.
On selge, et tĂ€itmise ĂŒlejÀÀnud kulud vĂ”ivad erinevates andmebaasides olla erinevad, kuid keerukus ei muutu kuidagi.
Pakutud rakenduses loob funktsionaalne andmebaasisĂŒsteem ĂŒhe alamkĂŒsimuse, mis arvutab osakonna jaoks vajalikud vÀÀrtused ja seejĂ€rel teeb JOIN osakondade tabeliga, et saada nime. Siiski, iga funktsiooni deklareerimise ajal on vĂ”imalik mÀÀrata eriline mĂ€rkeruum MATERIALIZED. SĂŒsteem loob automaatselt vastava vĂ€lja iga sellise funktsiooni jaoks. Funktsiooni vÀÀrtuse muutmisel muudetakse selle vĂ€lja vÀÀrtust samas tehingus. Funktsiooni kĂ”netamisel toimib see juba eelnevalt arvutatud vĂ€lja pĂ”hjal.
Konkreetsete funktsioonide puhul, kui mÀÀrata MATERIALIZED countEmployees ja salarySum, lisatakse osakondade nimekirja tabelisse kaks vĂ€lja, kus hoitakse töötajate arvu ja nende kogupalka. ĂkskĂ”ik millise töötaja, nende palga vĂ”i osakondade kuuluvuse muutumise korral muudab sĂŒsteem nende vĂ€lja vÀÀrtusi automaatselt. Eelpool toodud pĂ€ring hakkab otseselt nende vĂ€ljade poole pöörduma ja tĂ€idetakse kiiremini. O(osakondade arv).
Millised on piirangud? Ainult ĂŒks: selle funktsiooni jaoks peab olema piiratud hulk sisendvÀÀrtusi, mille jaoks selle vÀÀrtus on mÀÀratud. Muidu ei saa ehitada tabelit, mis salvestab kĂ”ik selle vÀÀrtused, kuna ei saa olla tabelit, millel on lĂ”pmatu arv ridasid.
NĂ€ide:
employeesCount 'Töötajate arv, kelle palk on > N' (Osakond 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 N vÀÀrtuste jaoks (nĂ€iteks sobib mis tahes negatiivne vÀÀrtus). SeetĂ”ttu ei saa sellele mÀÀrata MATERIALIZED. Seega on see loogiline, mitte tehniline piirang (see ei ole tingitud sellest, et me ei suutnud seda rakendada). Muus osas â mingeid piiranguid pole. VĂ”ib kasutada rĂŒhmitamisi, sorteerimisi, AND ja OR, PARTITION, rekurssioone jne.
NĂ€iteks ĂŒlesandes 2.2 eelnevas artiklis vĂ”ib mĂ”lemas funktsioonis mÀÀrata MATERIALIZED:
ostetud 'Ostetud' (Kliendid c, Toode p, KOHANE y) =Â
    GRUPI SUMMA sum(Detail d) KUIÂ
        klient(order(d)) = c JAÂ
        toode(d) = p JAÂ
        vÀlja vÔttaAasta(date(order(d))) = y MATERJALISEERITUD;
hinnang 'Hinnang' (Kliendid c, Toode p, KOHANE y) =Â
    PARTITSIOONI SUMMA 1 KORD DESC ostetud(c, p, y), p RĂNDI c, y MATERJALISEERITUD;
VALI kontaktNimi(Kliendid c), nimi(Toode p) KUS hinnang(c, p, 1997) < 3;
SĂŒsteem loob ise ĂŒhe tabeli tĂŒĂŒbi vĂ”tmetega Klient, Toode ja INTEGER, lisab sinna kaks vĂ€ljad ja uuendab nende vÀÀrtusi igasuguste muudatuste korral. Edasi liikudes ei toimu nende funktsioonide arvutamist, vaid vastavad vÀÀrtused loetakse vastavatest vĂ€ljadest.
Selle mehhanismi abil on vÔimalik, nÀiteks, lahti saada rekursioonidest (CTE) pÀringutes. Spetsiaalselt vaatame gruppe, mis moodustavad puu child/parent suhte abil (iga grupil on link oma vanemale):
parent = DATA Group (Group);
Funktsionaalses andmebaasis saab rekursioonide loogika mÀÀrata jÀrgmiselt:
tase (Grupi laps, Grupi vanem) = REKURSIOON 1l KUI laps ON Grupp JA vanem == laps
                                                             SAMM 2l KUI vanem == vanem($vanem);
onVanem (Grupi laps, Grupi vanem) = TĂSI KUI tase(laps, vanem) MATERJALISEERITUD;
Kuna funktsiooni isParent juures on mÀÀratud MATERIALIZED, siis selle jaoks luuakse tabel kahes vĂ”tmes (gruppides), kus vĂ€li isParent on tĂ”ene ainult siis, kui esimene vĂ”ti on teise jĂ€relmanne. Selle tabeli ridade arv on vĂ”rdeliselt gruppide arvuga, korrutatuna puu keskmise sĂŒgavusega. Kui on vaja, nĂ€iteks, kindla grupi jĂ€reltulijate arvu arvestada, siis saab sellele funktsioonile viidata:
lasteArv (Grupp g) = GRUPP SUM 1 KUI on vanem (Grupp laps, g);
SQL pÀringus ei ole mingit CTE-d. Selle asemel on tegemist lihtsa GROUP BY-ga.
Selle mehhanismi abil saab samuti vajadusel andmebaasi denormaliseerimist hÔlpsasti teostada:
CLASS Order 'Tellimus';
date 'KuupÀev' = DATA DATE (Tellimus);
CLASS OrderDetail 'Tellimuse rida';
order 'Tellimus' = DATA Order (OrderDetail);
date 'KuupÀev' (OrderDetail d) = date(order(d)) MATERIALIZED INDEXED;
Funktsioonile viidates date Tellimustabeli jaoks loetakse tellimuste ridade tabelist vĂ€lja vĂ€ljad, millel on indeks. Kui tellimuse kuupĂ€ev muutub, arvutab sĂŒsteem automaatselt denormaliseeritud kuupĂ€eva.
Eelised
Mis on kogu selle mehhanismi eesmÀrk? Klassikalistes andmebaasides, ilma pÀringute edasise muutmiseta, saab arendaja vÔi andmebaasi administraator ainult indekseid muuta, statistikat mÀÀrata ning anda pÀringute plaanijale juhiseid, kuidas neid tÀita (kuid HINT'e on olemas ainult kommertstoodetes). Kui nad ei pinguta, ei suuda nad esimest pÀringut artiklis tÀita. O (osakondade arv) ilma pÀringute muutmiseta ja kÀivitustriggerite kirjutamiseta. Pakutud skeemis ei pea arendamisetapis mÔtlema andmete salvestamise struktuurile ja selle peale, milliseid agregaatfunktsioone kasutada. KÔike seda saab mugavalt muuta reaalajas juba samaaegselt kasutuses.
KĂ€ praktikas nĂ€eb see vĂ€lja jĂ€rgmiselt. MĂ”ned inimesed arendavad otseselt loogikat ĂŒlesande pĂ”hjal. Nad ei tunne algoritme ega nende keerukust, ega tĂ€itmisplaane, ega join-tĂŒĂŒpe, ega muid tehnilisi aspekte. Need inimesed on pigem Ă€rianalĂŒĂŒtikud kui arendajad. SeejĂ€rel suundub kĂ”ik testimisele vĂ”i kĂ€itusse. LĂŒlitatakse sisse pikaajaliste pĂ€ringute logimine. Kui avastatakse pikaajaline pĂ€ring, siis otsustavad selle juba teised inimesed (tehnilisemad â sisuliselt DBA-d), et aktiveerida MATERIALIZED mĂ”nes vahefunktsioonis. See aeglustab natuke kirjutamist (kuna nĂ”uab tĂ€iendava vĂ€lja uuendamist tehingus). Kuid see kiirendab oluliselt mitte ainult seda pĂ€ringut, vaid ka kĂ”iki teisi, mis seda funktsiooni kasutavad. Otsuse tegemine, millist funktsiooni materialiseerida, on suures osas lihtne. Kaks peamist parameetrit: vĂ”imalikud sisendvÀÀrtuste arv (tĂ€pselt nii palju kirjeid on vastavas tabelis) ja kui sageli seda kasutatakse teistes funktsioonides.
Analoogid
Kaasaegsetes kaubanduskeskkondade andmebaasi haldustoodetes on sarnased mehhanismid: MATERIALISEERITUD VAATEPILT FAST REFRESH (Oracle) ja INDEXED VIEW (Microsoft SQL Server). PostgreSQL'is ei saa MATERIALISEERITUD VAATEPILT uuendada tehingus, vaid ainult pĂ€ringu kaudu (ja ĂŒsna range piirangutega), nii et seda ei kĂ€sitleta. Kuid neil on mitmeid probleeme, mis piiravad oluliselt nende kasutamist.
Esiteks, materialiseerimist saab lubada ainult siis, kui olete juba loonud tavalise VAATEPILDI. Vastasel juhul peate ĂŒmber kirjutama kĂ”ik ĂŒlejÀÀnud pĂ€ringud uue loodud vaatepildi kasutamiseks, et kasutada seda materialiseerimist. VĂ”i jĂ€tta kĂ”ik nagu on, kuid see on vĂ€hemalt ebaefektiivne, kui mĂ”ned andmed on juba ette arvutatud, aga palju pĂ€ringud ei kasuta neid alati, vaid arvutavad uuesti.
Teiseks, neil on tohutu hulk piiranguid:
Oracle
5.3.8.4 Ăldised piirangud kiireks vĂ€rskendamiseks
Materjaliseeritud vaatepildi mÀÀratlev pÀring on piiratud jÀrgmiselt:
- Materjaliseeritud vaatepilt ei tohi sisaldada viiteid kordumatutele vÀljenditele nagu
SYSDATEjaROWNUM.- Materjaliseeritud vaatepilt ei tohi sisaldada viiteid
RAWvĂ”iLONGRAWandme tĂŒĂŒ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.indeksi on mÀÀratud.- See ei tohi sisaldada
MUDALSee ei tohi viidata tabelile, millel on mÀÀratud- See ei tohi sisaldada
HAVINGlause koos alampĂ€ringuga.- See ei tohi sisaldada pesakĂŒsimusi, mis sisaldavad
ANY,ALL, vÔiNOTEXISTS.- See ei tohi sisaldada
[START WITH âŠ] ĂHENDUS BYSee ei tohi viidata tabelile, millel on mÀÀratud- See ei saa sisaldada mitut detailtabelit erinevates kohtades.
KASCOMMITmaterjaliseeritud vaated ei saa omada kauguseid detailtabeleid.- Sisetustatud materiaalsed vaated peavad sisaldama liitu vÔi agregati.
- Materjaliseeritud liitvaated ja materjaliseeritud agregatiivvaated koos
GRUPPBYklausi ei saa valida indeksiorganiseeritud tabelist.5.3.8.5 Kiire vÀrskenduse piirangud materiaalsed vaated ainult liidete jaoks
Sisetustatud pÀringud materiaalsed vaated ainult liidete ja ilma agregaatideta omavad jÀrgmisi piiranguid kiire vÀrskenduse jaoks:
- KÔik piirangud ««.
- Need ei saa sisaldada
GRUPPBYklausi vÔi agregaatide.- Tabelite rowid kogu
FROMloendis peavad ilmumaSELECTpÀringu loendis.- Materjaliseeritud vaate logid peavad sisaldama rowid kÔikide alustabelite
FROMpĂ€ringu loendis.- Sa ei saa luua kiiresti vĂ€rskendatavaid materjaliseeritud vaate mitmest tabelist, mille lihtsad liidud sisaldavad objekti tĂŒĂŒbi veergu
SELECTlausendis.Samuti ei ole valitud vÀrskendamise meetod optimaalselt tÔhus, kui:
- MÀÀrav pĂ€ring kasutab vĂ€list liitu, mis kĂ€itub nagu siseviit. Kui mÀÀrav pĂ€ring sisaldab sellist liitu, kaalu ĂŒmberkirjutamist mÀÀrava pĂ€ringu sisu muutmiseks siseviiduks.
- The
SELECTmaterjaliseeritud vaate loend sisaldab vÀljendeid mitmest tabelist.5.3.8.6 Kiire vÀrskenduse piirangud materiaalsed vaated agregaatide jaoks
Sisetustatud pÀringud materiaalsed vaated agregaatide vÔi liidete jaoks omavad jÀrgmisi piiranguid kiire vÀrskenduse jaoks:
- KÔik piirangud ««.
Kiire vÀrskendus on toetatud mÔlema jaoks
KASCOMMITjaKASNĂUDMINEmaterjaliseeritud vaated, kuid jĂ€rgmised piirangud kehtivad:
- KÔik tabelid materiaalsete vaadete peavad olema materjaliseeritud vaate logid ja need logid peavad:
- Sisaldama kÔiki veerge tabelist, millega viidatakse materjaliseeritud vaates.
- Spetsifitseerige
ROWIDjaKAASA ARVATUDUUTEVĂĂRTUSED.- Spetsifitseerige
SEKVENTSklausi, kui tabelit oodatakse, et seal oleks segu sisestamisest/otsesest laadimisest, kustutamist ja uuendamist.- Ainult
SUM,COUNT,AVG,STDDEV,VARIANTS,MINjaMAXtoetatakse kiire vÀrskenduse jaoks.COUNT(*)tuleb mÀÀrata.- Agregeerimisfunktsioonid vÔivad esineda ainult vÀljendi kÔige vÀlimises osas. See tÀhendab, et kogud nagu
AVG(AVG(x))vÔiAVG(x)+AVG(x)ei ole lubatud.- Iga aggregeerimise jaoks, nagu
AVG(expr), peab vastavCOUNT(expr)olema olemas. Oracle soovitab, etSUM(expr)oleks mÀÀratud.- Kui
VARIANCE(expr)vÔiSTDDEV(expr) on mÀÀratud,COUNT(expr)jaSUM(expr)tuleb mÀÀrata. Oracle soovitab, etSUM(expr *expr)oleks mÀÀratud.- The
SELECTveerg mÀÀratlemise pÀringus ei saa olla keeruline vÀljend mitmest pÔhiteabest. VÔimalik lahendus sellele on kasutada pesastatud materialiseeritud vaadet.- The
SELECTloend peab sisaldama kĂ”ikiGRUPPBYveerge.- Materialiseeritud vaade ei pĂ”hine ĂŒhel vĂ”i enam eemalolevast tabelist.
- Kui kasutate
CHARandmetĂŒĂŒpi materialiseeritud vaate logi filtreerimise veergudes, peavad masteri saidi ja materialiseeritud vaate karakterikomplektid olema samad.- Kui materialiseeritud vaates on ĂŒks jĂ€rgmistest, siis toimub kiire vĂ€rskendus ainult tavaliste DML sisestamiste ja otsekoormuste korral.
- Materialiseeritud vaated koos
MINvÔiMAXagregaatide- Materialiseeritud vaated, millel on
SUM(expr)aga ilmaCOUNT(expr)- Materialiseeritud vaated ilma
COUNT(*)Sellist materialiseeritud vaadet nimetatakse ainult sisestatavaks materialiseeritud vaateks.
- Materialiseeritud vaade, millel on
MAXvÔiMINon kiire vÀrskendatav pÀrast kustutamist vÔi segatud DML-lauseid, kui tal ei oleWHERESee ei tohi viidata tabelile, millel on mÀÀratud
Max/min kiire vÀrskendus pÀrast kustutamist vÔi segatud DML ei kÀitu sama moodi nagu ainult sisestatav juhtum. See kustutab ja uuesti arvutab maksimaalsed/minimaalsed vÀÀrtused mÔjutatud gruppide jaoks. Peate olema teadlik selle soorituse mÔjust.- Materialiseeritud vaated, millel on nimetatud vaated vÔi alampÀringud
FROMklauslis, vĂ”ivad olla kiiresti vĂ€rskendatud, tingimusel et vaated saab tĂ€ielikult ĂŒhendada. Teabe saamiseks selle kohta, millised vaated mergivad, vaadake .- Kui vĂ€list ĂŒhendumist ei ole, vĂ”ite teha meelevaldseid valikuid ja ĂŒhendusi.
WHERESee ei tohi viidata tabelile, millel on mÀÀratud- Materjaliseeritud agregeeritud vaated koos vĂ€lisĂŒhendustega on kiiresti vĂ€rskendatavad pĂ€rast tavapĂ€rast DML-i ja otsekoormusi, tingimusel et ainult vĂ€lisdiagramm on muudetud. Samuti peavad unikaalsed piirangud olema olemas sisendaabli ĂŒhendusveeru kohta. Kui on vĂ€lisĂŒhendusi, peavad kĂ”ik ĂŒhendused olema seotud
ANDja peavad kasutama vÔrdsus (=) operaatorit.- Materjaliseeritud vaadete jaoks, millel on
CUBE,ROLLUP, grupi komplektid vĂ”i nende ĂŒhendamine, kehtivad jĂ€rgmised piirangud:
- The
SELECTloend peaks sisaldama grupi eristajat, mis vĂ”ib olla kasGROUPING_IDfunktsioon kĂ”igiGRUPPBYavaldiste vĂ”iGROUPINGfunktsioonide jaoks, igaĂŒhe jaoksGRUPPBYavaldis. NĂ€iteks, kuiGRUPPBYmaterjaliseeritud vaate lause on «GRUPPBYCUBE(a, b)«, siis loend peaks sisaldama kas «SELECTGROUPING_ID(a, b)» vĂ”i «GROUPING(a)GROUPING(b)AND» materjaliseeritud vaate kiireks vĂ€rskendamiseks.» et materjaliseeritud vaade oleks kiire vĂ€rskendatav.GRUPPBYei tohi tulemuseks olla mingeid dubleeritud grupitusi. NĂ€iteks «GROUP BY a, ROLLUP(a, b)» ei ole kiiresti vĂ€rskendatav, kuna see toob kaasa dubleeritud grupitused «(a), (a, b), JA (a)«.5.3.8.7 Kiire vĂ€rskenduse piirangud materjaliseeritud vaadete puhul, kus on UNION ALL
Materjaliseeritud vaated koos
UNIONALLset operaator toetabVĂRSKENDUSKIIREvalikut, kui jĂ€rgmised tingimused on tĂ€idetud:
- MÀÀratlemise pÀring peab olema
UNIONALLoperaator tipus.The
UNIONALLoperaatorit ei tohi embedida alampĂ€ringusse, vĂ€lja arvatud ĂŒks erand:UNIONALLvĂ”ib olla alampĂ€ringusFROMlausendis, tingimusel et mÀÀratlemise pĂ€ring on kujulSELECT * FROM(vaade vĂ”i alampĂ€ring, millel onUNIONALL) nagu allolevas nĂ€ites:LOO VAADE view_with_unionall KUNA (SELECT c.rowid crid, c.cust_id, 2 umarker FROM customers c WHERE c.cust_last_name = 'Smith' UNION ALL SELECT c.rowid crid, c.cust_id, 3 umarker FROM customers c WHERE c.cust_last_name = 'Jones'); LOO MATERJALISEERITUD VAATETĐURNALL KIIRED VĂRSKENDUS NĂUDMISEL KUNA SELECT * FROM view_with_unionall;Pange tĂ€hele, et vaade
view_with_unionalltÀidab kiire vÀrskendamise nÔudeid.- Iga pÀringu blokis
UNIONALLpĂ€ring peab vastama kiiresti vĂ€rskendatava materjaliseeritud vaate nĂ”uetele, kus on koondandmed vĂ”i kiiresti vĂ€rskendatav materjaliseeritud vaade, kus on ĂŒhendused.Sobivad materjaliseeritud vaate logid peavad olema loodud tabelitele vastavalt nĂ”uetele, mis on seotud vastava tĂŒĂŒbi kiiresti vĂ€rskendatava materjaliseeritud vaate jaoks.
Pange tĂ€hele, et Oracle Database vĂ”imaldab ka erilist juhtumit, kus on ĂŒksik tabeli materjaliseeritud vaade, millel on ainult ĂŒhendused, tingimusel etROWIDveerg on hĂ”lmatudSELECTloendis ja materjaliseeritud vaate logis. Seda nĂ€idatakse vaate mÀÀratlemise pĂ€ringusview_with_unionall.- The
SELECTiga pĂ€ringu loendis peab olemaUNIONALLmarker ningUNIONALLveerg peab igasUNIONALLharu puhul olema eristuva pĂŒsiva numbrilise vĂ”i stringiga vÀÀrtusega.SELECTEdasi, marker veerg peab ilmuma samas jĂ€rjestuses igasUNION ALL Marker ja PĂ€ringu ĂmberkirjutamineUNIONALL» tĂ€iendava teabe saamiseks markerite kohta.- MĂ”ned funktsioonid, nagu vĂ€lised ĂŒhendused, ainult sisestamise koondandmete materjaliseeritud vaate pĂ€ringud ja kaugteabelaadid, ei ole toetatud materjaliseeritud vaadetes, millel on
UNIONALL. Pange tĂ€hele, et replikatsioonis kasutatavad materjaliseeritud vaated, mis ei sisalda ĂŒhendusi vĂ”i koondandmeid, saavad olla kiiresti vĂ€rskendatud, kuiUNIONALLvĂ”i kaugteabelaadid on kasutusel.- Ăhilduvuse algseadmise parameeter peab olema seadistatud 9.2.0 vĂ”i kĂ”rgemaks, et luua kiiresti vĂ€rskendatav materjaliseeritud vaade koos
UNIONALL.
Ma ei taha Oracle'i fĂ€nne solvata, kuid nende piirangute nimekirja pĂ”hjal tuleb mul tĂ”deda, et see mehhanism ei tundu olevat kirjutatud ĂŒldiselt, vaid nagu oleks igaĂŒhele antud vĂ”imalus kirjutada oma osa, milles igaĂŒks tegi, mida oskas. Selle mehhanismi kasutamine tegelikus loogikas on nagu kĂ€imine miinivĂ€ljal. Igal hetkel vĂ”ib sattuda miinile, sattudes ĂŒhele mitteilmsele piirangule. Kuidas see toimib, on samuti eraldi kĂŒsimus, kuid see jÀÀb antud artikli raamesse.
Microsoft SQL Server
Lisa nÔuded
Lisaks SET valikutele ja mÀÀratletud funktsioonide nÔuetele peavad olema tÀidetud jÀrgmised nÔuded:
- Kasutaja, kes kÀivitab
CREATE INDEXpeab olema vaate omanik.- Indeksi loomisel peab
IGNORE_DUP_KEYvalik olema seadistatud OFF (vaike vÀÀrtus).- Tabeleid tuleb viidata kaheosaliste nimede kaudu, skeemaga.tabelinimi vaate definitsioonis.
- Kasutaja mÀÀratud funktsioonid, millele viidatakse vaates, peavad olema loodud
WITH SCHEMABINDINGvalikuga.- Vaates viidatud kÔik kasutaja mÀÀratud funktsioonid peavad olema viidatud kaheosaliste nimede kaudu, <skeem>.<funktsioon>.
- Kasutaja mÀÀratud funktsiooni andmete ligipÀÀsu omadus peab olema
NO SQL, ja vĂ€lise ligipÀÀsu omadus peab olemaNO.- Ăhised keelekĂ€ituse (CLR) funktsioonid vĂ”ivad ilmuda vaate valikuloendis, kuid ei saa olla osa klastritud indeksi vĂ”tme mÀÀratlemisest. CLR funktsioonid ei tohi ilmuda vaate WHERE klauslis ega JOIN operatsiooni ON klauslis.
- CLR-funktsioonid ja CLR-kasutaja mÀÀratud tĂŒĂŒpide meetodid, mida kasutatakse vaate mÀÀratlemisel, peavad olema seatud nagu on nĂ€idatud jĂ€rgmises tabelis.
Omadus
MĂ€rkusDETERMINISTLIK = TRUE
Peab olema eksplitsiitselt deklareeritud Microsoft .NET Framework meetodi atribuudina.TĂPNE = TRUE
Peab olema eksplitsiitselt deklareeritud .NET Framework meetodi atribuudina.ANDMEKĂSIMINE = EI SQL
MÀÀratakse, seadistades DataAccess atribuudiks DataAccessKind.None ja SystemDataAccess atribuudiks SystemDataAccessKind.None.VĂLJASPOLISED JUURDEPĂĂS = EI
See omadus on vaikimisi EI CLR-rutiinide jaoks.- Vaate peab looma kasutades
WITH SCHEMABINDINGvalikuga.- Vaate peab viitama ainult baustabelitele, mis asuvad samas andmebaasis nagu vaade. Vaade ei tohi viidata teistele vaadetele.
- Vaate mÀÀratlemise SELECT-klauslis ei tohi sisaldada jÀrgmisi Transact-SQL elemente:
COUNT
ROWSET-funktsioonid (OPENDATASOURCE,OPENQUERY,OPENROWSET, JAOPENXML)
VĂLJASPOLISEDĂŒhendused (VASAK,PAREM, vĂ”iFULL)TĂŒvivaat (mÀÀratletud, tĂ€psustades
SELECTlausestFROMklauslis)
Iseliitmine
Veergude mÀÀratlemine kasutadesSELECT *vÔiSELECT.*
DISTINCT
STDEV,STDEVP,VAR,VARP, vÔiAVG
Ăhine tabeli vĂ€ljend (CTE)float1, text, ntext, pilt, XML, vĂ”i filestream veergud
AlampÀring
OVERklausel, mis sisaldab jÀrjestus- vÔi kogumifunktsiooneTÀisteksti sÔelad (
CONTAINS,FREETEXT)
SUMfunktsioon, mis viitab nullitavale vÀljendile
ORDER BYCLR kasutaja mÀÀratud agregaatfunktsioon
TOP
CUBE,ROLLUP, vÔiGROUPING SETSoperaatorid
MIN,MAX
UNION,VĂLJAS, vĂ”iINTERSECToperaatorid
TABLESAMPLETabelimuutujad
VĂLJASPOLISED APPLYvĂ”iRISTSĂND APPLY
PIVOT,UNPIVOTSparse veergude komplektid
Inline (TVF) vÔi mitme lausestuse tabelivÀÀrtuste funktsioonid (MSTVF)
OFFSET
CHECKSUM_AGG1 Indekseeritud vaade vÔib sisaldada float veerge; selliseid veerge ei tohi siiski lisada klastreeritud indeksi vÔtmesse.
- Kui
GROUP BYolemasolekul peab VAATE mÀÀratlemine sisaldamaCOUNT_BIG(*)ja ei tohi sisaldadaHAVING. NeedGROUP BYpiirangud kehtivad ainult indekseeritud vaate mÀÀratlemise kohta. KĂŒsimus vĂ”ib kasutada indekseeritud vaadet oma tĂ€itmisplaanis, isegi kui see ei rahulda neidGROUP BYpiiranguid.- Kui vaate mÀÀratlemine sisaldab
GROUP BYslau, unikaalse klastreeritud indeksi vÔti vÔib viidata ainult mÀÀratud veergudeleGROUP BYSee ei tohi viidata tabelile, millel on mÀÀratudSiit on nÀha, et indiaanlasi ei kaasatud, kuna nad otsustasid jÀrgida skeemi "teeme vÀhe, aga hÀsti". See tÀhendab, et neil on rohkem maamÀrke vÀljal, kuid nende paigutus on selgem. KÔige rohkem teeb mureks see piirang:
Vaate peab viitama ainult baustabelitele, mis asuvad samas andmebaasis nagu vaade. Vaade ei tohi viidata teistele vaadetele.
Meie terminoloogias tÀhendab see, et funktsioon ei saa viidata teisele materialiseeritud funktsioonile. See hÀvitab kogu ideoloogia tÀielikult.
Samuti vÀhendab see piirang (ja edasi tekstis) oluliselt kasutusvÔimalusi:Vaate mÀÀratlemise SELECT-klauslis ei tohi sisaldada jÀrgmisi Transact-SQL elemente:
COUNT
ROWSET-funktsioonid (OPENDATASOURCE,OPENQUERY,OPENROWSET, JAOPENXML)
VĂLJASPOLISEDĂŒhendused (VASAK,PAREM, vĂ”iFULL)TĂŒvivaat (mÀÀratletud, tĂ€psustades
SELECTlausestFROMklauslis)
Iseliitmine
Veergude mÀÀratlemine kasutadesSELECT *vÔiSELECT.*
DISTINCT
STDEV,STDEVP,VAR,VARP, vÔiAVG
Ăhine tabeli vĂ€ljend (CTE)float1, text, ntext, pilt, XML, vĂ”i filestream veergud
AlampÀring
OVERklausel, mis sisaldab jÀrjestus- vÔi kogumifunktsiooneTÀisteksti sÔelad (
CONTAINS,FREETEXT)
SUMfunktsioon, mis viitab nullitavale vÀljendile
ORDER BYCLR kasutaja mÀÀratud agregaatfunktsioon
TOP
CUBE,ROLLUP, vÔiGROUPING SETSoperaatorid
MIN,MAX
UNION,VĂLJAS, vĂ”iINTERSECToperaatorid
TABLESAMPLETabelimuutujad
VĂLJASPOLISED APPLYvĂ”iRISTSĂND APPLY
PIVOT,UNPIVOTSparse veergude komplektid
Inline (TVF) vÔi mitme lausestuse tabelivÀÀrtuste funktsioonid (MSTVF)
OFFSET
CHECKSUM_AGGOUTER JOINâid, UNION, ORDER BY ja muud on keelatud. VĂ”ib-olla oleks olnud lihtsam öelda, mida tohib kasutada, kui seda, mida ei tohi. Loend oleks tĂ”enĂ€oliselt palju lĂŒhem.
KokkuvĂ”tteks: tohutu arv piiranguid igas (mĂ€rgin, Ă€rilise) SĂBDes vs mitte midagi (vĂ€lja arvatud ĂŒks loogiline, mitte tehniline) LGPL tehnoloogias. Siiski tuleb mĂ€rkida, et sellele mehhanismile rakendamine relatiivsuse loogikas on veidi keerulisem kui kirjeldatud funktsionaalses.
Rakendus
Kuidas see töötab? "Virtuaalse masinana" kasutatakse PostgreSQL-i. Siseselt on keeruline algoritm, mis tegeleb pÀringute koostamisega. Siin on . Ja seal pole lihtsalt suur hulk heuristikaga, kus on palju if-eid. Nii et kui teil on paar kuud Ôppimiseks, vÔite proovida arhitektuuri mÔista.
Kas see töötab tĂ”husalt? Piisavalt tĂ”husalt. Kahjuks on seda raske tĂ”estada. VĂ”in vaid öelda, et kui vaadata tuhandeid pĂ€ringuid, mis on suurtes rakendustes, siis keskmiselt on need tĂ”husamad kui hea arendaja omad. SuurepĂ€rane SQL-programmeerija vĂ”ib kirjutada iga pĂ€ringu tĂ”husamalt, kuid tuhandete pĂ€ringute puhul ei ole tal lihtsalt motivatsiooni ega aega seda teha. Ainus, mida ma praegu tĂ”hususe tĂ”endina tuua saan, on see, et selle andmebaasi pĂ”hjal töötavad mitmed projektid , kus on tuhandeid erinevaid MATERIALIZED funktsioone, tuhandete kasutajatega ja terabaidiste andmebaasidega, kus on sadu miljoneid kirjeid, töötades tavalise kahe protsessoriga serveris. Siiski vĂ”ib igaĂŒks, kes soovib, efektiivsust kontrollida/ĂŒmber lĂŒkata, laadides alla ja PostgreSQL, SQL-pĂ€ringute logimise ja proovides seal loogikat ja andmeid muuta.
JÀrgmistes artiklites rÀÀgin ka sellest, kuidas funktsioonidele piiranguid seada, kuidas töötada seansimuudatustega ja palju muust.
Allikas: habr.comOsta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đ„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster
