Andmete lugemise ja kirjutamise tasakaalustamine andmebaasis

Andmete lugemise ja kirjutamise tasakaalustamine andmebaasis
Eelmises osas artiklis 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 SYSDATE ja ROWNUM.
  • Materjaliseeritud vaatepilt ei tohi sisaldada viiteid RAW vĂ”i LONG RAW andme tĂŒĂŒpidele.
  • See ei tohi sisaldada SELECT loendi alampĂ€ringut.
  • See ei tohi sisaldada analĂŒĂŒtilisi funktsioone (nĂ€iteks RANK) lauses. SELECT See ei tohi viidata tabelile, millel on mÀÀratud
  • XMLIndex indeks. indeksi on mÀÀratud.
  • See ei tohi sisaldada MUDAL See ei tohi viidata tabelile, millel on mÀÀratud
  • See ei tohi sisaldada HAVING lause koos alampĂ€ringuga.
  • See ei tohi sisaldada pesakĂŒsimusi, mis sisaldavad ANY, ALL, vĂ”i NOT EXISTS.
  • See ei tohi sisaldada [START WITH 
] ÜHENDUS BY See ei tohi viidata tabelile, millel on mÀÀratud
  • See ei saa sisaldada mitut detailtabelit erinevates kohtades.
  • KAS COMMIT materjaliseeritud vaated ei saa omada kauguseid detailtabeleid.
  • Sisetustatud materiaalsed vaated peavad sisaldama liitu vĂ”i agregati.
  • Materjaliseeritud liitvaated ja materjaliseeritud agregatiivvaated koos GRUPP BY klausi 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 Â«Ăœldised piirangud kiire vĂ€rskenduse jaoks«.
  • Need ei saa sisaldada GRUPP BY klausi vĂ”i agregaatide.
  • Tabelite rowid kogu FROM loendis peavad ilmuma SELECT pĂ€ringu loendis.
  • Materjaliseeritud vaate logid peavad sisaldama rowid kĂ”ikide alustabelite FROM pĂ€ringu loendis.
  • Sa ei saa luua kiiresti vĂ€rskendatavaid materjaliseeritud vaate mitmest tabelist, mille lihtsad liidud sisaldavad objekti tĂŒĂŒbi veergu SELECT lausendis.

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 SELECT materjaliseeritud 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:

Kiire vĂ€rskendus on toetatud mĂ”lema jaoks KAS COMMIT ja KAS NÕUDMINE materjaliseeritud 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 ROWID ja KAASA ARVATUD UUTE VÄÄRTUSED.
    • Spetsifitseerige SEKVENTS klausi, kui tabelit oodatakse, et seal oleks segu sisestamisest/otsesest laadimisest, kustutamist ja uuendamist.

  • Ainult SUM, COUNT, AVG, STDDEV, VARIANTS, MIN ja MAX toetatakse 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Ă”i AVG(x)+ AVG(x) ei ole lubatud.
  • Iga aggregeerimise jaoks, nagu AVG(expr), peab vastav COUNT(expr) olema olemas. Oracle soovitab, et SUM(expr) oleks mÀÀratud.
  • Kui VARIANCE(expr) vĂ”i STDDEV(expr) on mÀÀratud, COUNT(expr) ja SUM(expr) tuleb mÀÀrata. Oracle soovitab, et SUM(expr *expr) oleks mÀÀratud.
  • The SELECT veerg mÀÀratlemise pĂ€ringus ei saa olla keeruline vĂ€ljend mitmest pĂ”hiteabest. VĂ”imalik lahendus sellele on kasutada pesastatud materialiseeritud vaadet.
  • The SELECT loend peab sisaldama kĂ”iki GRUPP BY veerge.
  • Materialiseeritud vaade ei pĂ”hine ĂŒhel vĂ”i enam eemalolevast tabelist.
  • Kui kasutate CHAR andmetĂŒĂŒ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 MIN vĂ”i MAX agregaatide
    • Materialiseeritud vaated, millel on SUM(expr) aga ilma COUNT(expr)
    • Materialiseeritud vaated ilma COUNT(*)

    Sellist materialiseeritud vaadet nimetatakse ainult sisestatavaks materialiseeritud vaateks.

  • Materialiseeritud vaade, millel on MAX vĂ”i MIN on kiire vĂ€rskendatav pĂ€rast kustutamist vĂ”i segatud DML-lauseid, kui tal ei ole WHERE See 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 FROM klauslis, vĂ”ivad olla kiiresti vĂ€rskendatud, tingimusel et vaated saab tĂ€ielikult ĂŒhendada. Teabe saamiseks selle kohta, millised vaated mergivad, vaadake Oracle Database SQL Language Reference.
  • Kui vĂ€list ĂŒhendumist ei ole, vĂ”ite teha meelevaldseid valikuid ja ĂŒhendusi. WHERE See 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 SELECT loend peaks sisaldama grupi eristajat, mis vĂ”ib olla kas GROUPING_ID funktsioon kĂ”igi GRUPP BY avaldiste vĂ”i GROUPING funktsioonide jaoks, igaĂŒhe jaoks GRUPP BY avaldis. NĂ€iteks, kui GRUPP BY materjaliseeritud vaate lause on «GRUPP BY CUBE(a, b)«, siis loend peaks sisaldama kas « SELECT GROUPING_ID(a, b)» vĂ”i «GROUPING(a)GROUPING(b) AND » materjaliseeritud vaate kiireks vĂ€rskendamiseks.» et materjaliseeritud vaade oleks kiire vĂ€rskendatav.
    • GRUPP BY ei 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 UNION ALL set operaator toetab VÄRSKENDUS KIIRE valikut, kui jĂ€rgmised tingimused on tĂ€idetud:

  • MÀÀratlemise pĂ€ring peab olema UNION ALL operaator tipus.

    The UNION ALL operaatorit ei tohi embedida alampĂ€ringusse, vĂ€lja arvatud ĂŒks erand: UNION ALL vĂ”ib olla alampĂ€ringus FROM lausendis, tingimusel et mÀÀratlemise pĂ€ring on kujul SELECT * FROM (vaade vĂ”i alampĂ€ring, millel on UNION ALL) 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_unionall tÀidab kiire vÀrskendamise nÔudeid.

  • Iga pĂ€ringu blokis UNION ALL pĂ€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 et ROWID veerg on hĂ”lmatud SELECT loendis ja materjaliseeritud vaate logis. Seda nĂ€idatakse vaate mÀÀratlemise pĂ€ringus view_with_unionall.

  • The SELECT iga pĂ€ringu loendis peab olema UNION ALL marker ning UNION ALL veerg peab igas UNION ALL haru puhul olema eristuva pĂŒsiva numbrilise vĂ”i stringiga vÀÀrtusega. SELECT Edasi, marker veerg peab ilmuma samas jĂ€rjestuses igaspĂ€ringu ploki loendis. Vaadake «UNION ALL Marker ja PĂ€ringu Ümberkirjutamine UNION ALL » 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 UNION ALL. Pange tĂ€hele, et replikatsioonis kasutatavad materjaliseeritud vaated, mis ei sisalda ĂŒhendusi vĂ”i koondandmeid, saavad olla kiiresti vĂ€rskendatud, kui UNION ALL vĂ”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 UNION ALL.

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 INDEX peab olema vaate omanik.
  • Indeksi loomisel peab IGNORE_DUP_KEY valik 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 SCHEMABINDING valikuga.
  • 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 olema NO.
  • Ü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Ă€rkus

    DETERMINISTLIK = 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 SCHEMABINDING valikuga.
  • 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, JA OPENXML)
    VÄLJASPOLISED ĂŒhendused (VASAK, PAREM, vĂ”i FULL)

    TĂŒvivaat (mÀÀratletud, tĂ€psustades SELECT lausest FROM klauslis)
    Iseliitmine
    Veergude mÀÀratlemine kasutades SELECT * vÔi SELECT

    .*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, vÔi AVG
    Ühine tabeli vĂ€ljend (CTE)

    float1, text, ntext, pilt, XML, vÔi filestream veergud
    AlampÀring
    OVER klausel, mis sisaldab jÀrjestus- vÔi kogumifunktsioone

    TÀisteksti sÔelad (CONTAINS, FREETEXT)
    SUM funktsioon, mis viitab nullitavale vÀljendile
    ORDER BY

    CLR kasutaja mÀÀratud agregaatfunktsioon
    TOP
    CUBE, ROLLUP, vÔi GROUPING SETS operaatorid

    MIN, MAX
    UNION, VÄLJAS, vĂ”i INTERSECT operaatorid
    TABLESAMPLE

    Tabelimuutujad
    VÄLJASPOLISED APPLY vĂ”i RISTSÜND APPLY
    PIVOT, UNPIVOT

    Sparse veergude komplektid
    Inline (TVF) vÔi mitme lausestuse tabelivÀÀrtuste funktsioonid (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 Indekseeritud vaade vÔib sisaldada float veerge; selliseid veerge ei tohi siiski lisada klastreeritud indeksi vÔtmesse.

  • Kui GROUP BY olemasolekul peab VAATE mÀÀratlemine sisaldama COUNT_BIG(*) ja ei tohi sisaldada HAVING. Need GROUP BY piirangud kehtivad ainult indekseeritud vaate mÀÀratlemise kohta. KĂŒsimus vĂ”ib kasutada indekseeritud vaadet oma tĂ€itmisplaanis, isegi kui see ei rahulda neid GROUP BY piiranguid.
  • Kui vaate mÀÀratlemine sisaldab GROUP BY slau, unikaalse klastreeritud indeksi vĂ”ti vĂ”ib viidata ainult mÀÀratud veergudele GROUP BY See ei tohi viidata tabelile, millel on mÀÀratud
  • Siit 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, JA OPENXML)
    VÄLJASPOLISED ĂŒhendused (VASAK, PAREM, vĂ”i FULL)

    TĂŒvivaat (mÀÀratletud, tĂ€psustades SELECT lausest FROM klauslis)
    Iseliitmine
    Veergude mÀÀratlemine kasutades SELECT * vÔi SELECT

    .*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, vÔi AVG
    Ühine tabeli vĂ€ljend (CTE)

    float1, text, ntext, pilt, XML, vÔi filestream veergud
    AlampÀring
    OVER klausel, mis sisaldab jÀrjestus- vÔi kogumifunktsioone

    TÀisteksti sÔelad (CONTAINS, FREETEXT)
    SUM funktsioon, mis viitab nullitavale vÀljendile
    ORDER BY

    CLR kasutaja mÀÀratud agregaatfunktsioon
    TOP
    CUBE, ROLLUP, vÔi GROUPING SETS operaatorid

    MIN, MAX
    UNION, VÄLJAS, vĂ”i INTERSECT operaatorid
    TABLESAMPLE

    Tabelimuutujad
    VÄLJASPOLISED APPLY vĂ”i RISTSÜND APPLY
    PIVOT, UNPIVOT

    Sparse veergude komplektid
    Inline (TVF) vÔi mitme lausestuse tabelivÀÀrtuste funktsioonid (MSTVF)
    OFFSET

    CHECKSUM_AGG

    OUTER 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 allikas. 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 ERP-sĂŒsteemid, 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 platvormi ja PostgreSQL, lĂŒlitades sisse 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.com

    Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster