Andmete lugemise ja kirjutamise tasakaalustamine andmebaasis

Andmete lugemise ja kirjutamise tasakaalustamine andmebaasis
Eelnevas artiklis 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 SYSDATE ja ROWNUM.
  • Materialiseeritud vaade ei tohi sisaldada viiteid RAW vĂ”i LONG RAW andmetĂŒĂŒ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. MODEL
  • See ei tohi sisaldada HAVING See 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Ă”iNOT EXISTS EXISTS.
  • See ei tohi sisaldada [START WITH 
] ÜHENDAGE BY See ei tohi viidata tabelile, millel on mÀÀratud
  • See ei tohi sisaldada mitut detailtabelit erinevates kohtades.
  • KAS COMMIT materjaliseeritud vaated ei tohi omada kauguses detailtabeleid.
  • Sisemised materjaliseeritud vaated peavad sisaldama liitumist vĂ”i agregaati.
  • Materjaliseeritud liitumisvaated ja materjaliseeritud agregaativaated koos GRUPPIDA KOHES klausel 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 Â«Ăœldised piirangud kiirele vĂ€rskendusele«.
  • Nad ei tohi sisaldada GRUPPIDA KOHES klausuure ega agregaate.
  • Tabelite ridade ID-d KUST loend peab ilmuma SELECT pĂ€ringu nimekirja.
  • Materjaliseeritud vaate logid peavad eksisteerima kĂ”igi aluste tabelite ridade ID-dega KUST pĂ€ringu nimekirja.
  • Te ei saa luua kiiresti vĂ€rskendatavat materjaliseeritud vaadet mitmest tabelist, kus on lihtsad liidud, mis sisaldavad objekti tĂŒĂŒpi veergu SELECT lausendis.

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

Kiire vĂ€rskendus on toetatud mĂ”lema jaoks KAS COMMIT ja KAS NÕUDMINE materjaliseeritud 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 ROWID ja KATMA UUTE VÄÄRTUSTE.
    • Osutama JÕUD klausus, kui tabelil on oodata sisestuste/otsese laadimise, kustutamise ja vĂ€rskenduste segu.

  • Ainult SUMMA, LOEND, AVG, STDDEV, VARIANTS, MIN ja MAX toetatakse 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Ă”i AVG(x)+ AVG(x) ei ole lubatud.
  • Iga agregaadi puhul nagu AVG(expr), vastav COUNT(expr) peab olema olemas. Oracle soovitab, et SUM(expr) peaks olema mÀÀratud.
  • Kui VARIANTS(expr) vĂ”i STDDEV(expr) on mÀÀratud, COUNT(expr) ja SUM(expr) peab olema mÀÀratud. Oracle soovitab, et SUM(expr *expr) peaks olema mÀÀratud.
  • Materjaliseeritud vaate SELECT veerg 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 SELECT loend peab sisaldama kĂ”iki GRUPPIDA KOHES veerge.
  • Materjaliseeritud vaade ei pĂ”hine ĂŒhel vĂ”i mitmel kaugtabelil.
  • Kui kasutate CHAR andmetĂŒĂŒ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 MIN vĂ”i MAX agregaadid
    • Materjaliseeritud vaated, millel on SUM(expr) kuid ei ole COUNT(expr)
    • Materjaliseeritud vaated ilma LOEND(*)

    Sellist materjaliseeritud vaadet nimetatakse ainult sisestamismaterjaliseeritud vaateks.

  • Materjaliseeritud vaade, millel on MAX vĂ”i MIN on kiiresti vĂ€rskendatav pĂ€rast kustutamist vĂ”i segatud DML-lauseid, kui sellel ei ole KUS See 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 KUST vĂ”ivad olla kiiresti vĂ€rskendatavad, tingimusel et vaated on tĂ€ielikult ĂŒhendatud. Teave selle kohta, millised vaated saavad ĂŒhendatud, vaadake Oracle Database SQL Keele Viidatud.
  • Kui puuduvad vĂ€list liidud, vĂ”ite olla arengulised valikud ja liidud. KUS See 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 SELECT loendis peaks olema grupeerimise eristaja, mis vĂ”ib olla kas GROUPING_ID funktsioon kĂ”ikide GRUPPIDA KOHES avaldiste vĂ”i GROUPING funktsioonide puhul, ĂŒks igaĂŒhe jaoks GRUPPIDA KOHES avaldis. NĂ€iteks, kui GRUPPIDA KOHES materjaliseeritud vaate klauses on «GRUPPIDA KOHES KUBE(a, b)«, peaks loendis olema kas « SELECT GROUPING_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, «
    • GRUPPIDA KOHES GROUP 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Ă”i VÄRSKENDUS KIIRE valikut, kui jĂ€rgmised tingimused on tĂ€idetud: MÀÀrava pĂ€ringu tipus peab olema

  • operaator. kogumi operaator, toetavad , vĂ”i operaatorit ei tohi sĂŒgavale pĂ€ringusseEmbedida, vĂ€lja arvatud ĂŒks erand:

    Materjaliseeritud vaate kogumi operaator, toetavad , vĂ”i vĂ”ib olla alampĂ€ringus kogumi operaator, toetavad , vĂ”i klauses, tingimusel et mÀÀrav pĂ€ring on vormis KUST SELECT * 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 vaade
    

    view_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Ă”i Pange tĂ€hele, et Oracle Database lubab ka erijuhtume, kus on olemas ainult ĂŒks tabeli materjaliseeritud vaade koos ĂŒhendustega, tingimusel et

    veerg on sisaldatud
    loendis ja materjaliseeritud vaate logis. See on nÀidatud vaate mÀÀrava pÀringu ROWID loend sees olev pÀring peab sisaldama SELECT mÀrker, ja veerg peab olema igas rahuldab kiire vÀrskenduse nÔudeid..

  • Materjaliseeritud vaate SELECT harude eristamiseks ĂŒksikasjalik alates logisid. Edasi, mĂ€rker veerg peab ilmuma igasuguses ortoossaas iga kĂŒsimuses. Vaadake « kogumi operaator, toetavad , vĂ”i UNION ALL Marker ja PĂ€ringu Ümberkirjutamine kogumi operaator, toetavad , vĂ”i » rohkem teavet mĂ€rkerite kohta. kogumi operaator, toetavad , vĂ”i MĂ”ned funktsioonid, nagu vĂ€lised ĂŒhendused, ainult sisestamise agregaatide materjaliseeritud vaate pĂ€ringud ja kaugmootorid ei ole toetatud materjaliseeritud vaadetes SELECT . Pange tĂ€hele, et materjaliseeritud vaated, mida kasutatakse replikatsioonis, mis ei sisalda ĂŒhendusi vĂ”i agregaate, vĂ”ivad olla kiiresti vĂ€rskendatud, kuivĂ”i kaugmootoreid kasutatakse.Ühildav algparameeter peab olema seatud 9.2.0 vĂ”i kĂ”rgemale, et luua kiiresti vĂ€rskendatav materjaliseeritud vaate. kogumi operaator, toetavad , vĂ”i mĂ€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, kui kogumi operaator, toetavad , vĂ”i vĂ”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 INDEX peab olema vaate omanik.
  • Kui loote indeksi, peab IGNORE_DUP_KEY valik 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 SCHEMABINDING valikut.
  • 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 olema NO.
  • Ü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Ă€rkus

    DETERMINISTIC = 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 SCHEMABINDING valikut.
  • 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, JA OPENXML)
    VÄLJAS liitumised (VASAK, PAREMNOT TÄIELIK)

    Tuletatud tabel (mÀÀratletud, mÀÀrates otse SELECT lausesse) KUST Ishalud
    MÀÀratleda veerge, kasutades
    SELECT * SELECT <table_name>.* vÔi DISTINCT

    STDEV
    STDEVP, VAR, VARP, Üksik tabeli vĂ€ljund (CTE)NOT AVG
    float

    tekst1, ntext, XML, image, filestreamNOT veergudest AlamkĂŒsimus
    ÜLE
    lausest, mis sisaldab jÀrjestamis- vÔi agregaatakna funktsioone TÀisteksti mÀÀratlused (

    CONTAINSFREETEXT, funktsioon, mis viitab nullitavale vÀljendile)
    SUMMA KORRALDA BY
    CLR kasutaja mÀÀratletud agregaatfunktsioon

    TOP
    GRUPP IMESED
    KUBE, ROLLUPNOT operaatorid ERINEVUS

    MIN, MAX
    kogumi operaator, toetavad, INTERSECTNOT TABLESAMPLE ERINEVUS
    Tabeli muutuja

    VÄLJAS KASUTA
    RISTI KASUTA vÔi PIVOT
    UNPIVOT, Sparsse veergude komplektid

    Inline (TVF) vÔi mitme avaldise tabeli vÀÀrtuse funktsioonid (MSTVF)
    OFFSET
    CHECKSUM_AGG

    1 Indekseeritud vaade vÔib sisaldada

    veerge; kuid selliseid veerge ei saa lisada klastrisse indeksivÔti. tekst GRUPP BY

  • Kui on olemas, vaate mÀÀratlemine peab sisaldama COUNT_BIG(*) ja ei tohi sisaldada . Need klausel alampĂ€ringuga.piirangud kehtivad ainult indekseeritud vaate mÀÀratlemise kohta. KĂŒsitav saab kasutada indekseeritud vaadet oma kĂ€itamisplaanis, isegi kui see ei vasta sellele on olemas, vaate mÀÀratlemine peab sisaldama piirangud. on olemas, vaate mÀÀratlemine peab sisaldama Kui vaate mÀÀratlemine sisaldab a
  • Kui vaate mÀÀratlemine sisaldab on olemas, vaate mÀÀratlemine peab sisaldama tingimus, ainulaadse klastriga indeksi vĂ”ti saab viidata ainult mÀÀratud veergudele on olemas, vaate mÀÀratlemine peab sisaldama See 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, JA OPENXML)
VÄLJAS liitumised (VASAK, PAREMNOT TÄIELIK)

Tuletatud tabel (mÀÀratletud, mÀÀrates otse SELECT lausesse) KUST Ishalud
MÀÀratleda veerge, kasutades
SELECT * SELECT <table_name>.* vÔi DISTINCT

STDEV
STDEVP, VAR, VARP, Üksik tabeli vĂ€ljund (CTE)NOT AVG
float

tekst1, ntext, XML, image, filestreamNOT veergudest AlamkĂŒsimus
ÜLE
lausest, mis sisaldab jÀrjestamis- vÔi agregaatakna funktsioone TÀisteksti mÀÀratlused (

CONTAINSFREETEXT, funktsioon, mis viitab nullitavale vÀljendile)
SUMMA KORRALDA BY
CLR kasutaja mÀÀratletud agregaatfunktsioon

TOP
GRUPP IMESED
KUBE, ROLLUPNOT operaatorid ERINEVUS

MIN, MAX
kogumi operaator, toetavad, INTERSECTNOT TABLESAMPLE ERINEVUS
Tabeli muutuja

VÄLJAS KASUTA
RISTI KASUTA vÔi PIVOT
UNPIVOT, Sparsse veergude komplektid

Inline (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 allikas kood. 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 ERP-sĂŒsteemid, 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 platvormi ja PostgreSQL, ĂŒlendades 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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster