
Në Unë e përshkrova konceptin dhe realizimin e një baze të dhënash të ndërtuar mbi funksione, jo mbi tabela dhe fusha si në bazat e të dhënave relacionale. Atëherë janë paraqitur shumë shembuj që tregojnë përparësitë e këtij qasje përball klasikes. Shumë e konsideruan këtë si jo mjaft bindëse.
Në këtë artikull do të tregoj se si një koncept i tillë lejon që të balancojmë shpejt dhe lehtësisht regjistrimin dhe leximin në një bazë të dhënash pa bërë ndonjë ndryshim në logjikën e funksionimit. Një funksionalitet i ngjashëm është përpjekur të realizohet në sistemet komerciale moderne të bazave të dhënash (sidomos, Oracle dhe Microsoft SQL Server). Në fund të artikullit do të tregoj se çfarë arritën ata, le të themi, jo shumë mirë.
Përshkrimi
Si dhe më parë, për një kuptim më të mirë do të filloj përshkrimin me shembuj. Supozoni se na nevojitet të realizojmë logjikën që do të kthejë një listë departamentesh me numrin e punonjësve në to dhe pagën e tyre totale.
Në bazën e dhënash funksionale kjo do të duket si më poshtë:
CLASS Department âDepartamentiâ;
name âEmriâ = DATA STRING[100] (Departamenti);
CLASS Employee 'Punonjësi';
department 'Departamenti' = DATA Department (Employee);
salary 'Paga' = DATA NUMERIC[10,2] (Employee);
countEmployees 'Numri i punonjĂ«sve' (Department d) =Â
    GROUP SUM 1 IF department(Employee e) = d;
salarySum 'Paga totale' (Department d) =Â
    GROUP SUM salary(Employee e) IF department(e) = d;
SELECT name(Department d), countEmployees(d), salarySum(d);
Vështirësia e realizimit të këtij kërkese në çdo SGBD do të jetë e barabartë me O(numri i punonjësve), pasi për këtë llogaritje kërkohet të skanohet e gjithë tabela e punonjësve dhe pastaj të grupohen ata sipas departamentit. Do të ketë gjithashtu një shtesë të vogël (le të supozojmë se numri i punonjësve është shumë më i madh se numri i departamenteve) në varësi të planit të zgjedhur O(log numri i punonjësve) ose O(numri i departamenteve) për grupimin dhe të tjera.
ĂshtĂ« e qartĂ« se shpenzimet pĂ«r realizimin mund tĂ« jenĂ« tĂ« ndryshme nĂ« SGBD tĂ« ndryshme, por vĂ«shtirĂ«sia nuk do tĂ« ndryshojĂ« aspak.
Në implementimin e propozuar, sistemi i menaxhimit të bazave të dhënash funksionale do të formojë një nënpyetje, e cila do të llogarisi vlerat e nevojshme për departamentin dhe më pas do të kryejë JOIN me tabelën e departamenteve për të marrë emrin. Megjithatë, për çdo funksion në shpallje ka mundësinë të caktohet një shenjë speciale MATERIALIZED. Sistemi automatikisht do të krijojë një fushë përkatëse për çdo funksion të tillë. Kur ndërron vlera funksioni, do të ndodhi njëkohësisht ndërrimi i vlerës së fushës në të njëjtën transaksion. Kur iu qaseni këtij funksioni, do të bëhet kërkesë për fushën e llogaritur tashmë.
Në veçanti, nëse vendosni MATERIALIZED për funksionet countEmployees dhe salarySum, tabelës me listën e departamenteve do t'i shtohen dy fusha, në të cilat do të ruhen numri i punonjësve dhe paga e tyre totale. Në çdo ndryshim të punonjësve, pagave të tyre ose përkatësisë në departamente, sistemi do të ndryshojë automatikisht vlerat e këtyre fushave. Kërkesa e mëparshme do të bëhet në mënyrë të drejtpërdrejtë për këto fusha dhe do të realizohet për O(numri i departamenteve).
Cilat janë kufizimet? Vetëm një: ky funksion duhet të ketë një numër të caktuar hyrjesh, për të cilat vlera e tij është e përcaktuar. Ndryshe, nuk do të jetë e mundur të ndërtosh një tabelë që ruan të gjitha vlerat e saj, pasi nuk mund të ketë një tabelë me një numër të pafund rreshtash.
Shembulli:
numriPunonjĂ«sve âNumri i punonjĂ«sve me pagĂ« > Nâ (Departamenti d, NUMERIC[10,2] N) =Â
    GRUPI SUM pagĂ«n(PunonjĂ«si e) NĂSE departamenti(e) = d DHE paga(e) > N;
Ky funksion Ă«shtĂ« i pĂ«rcaktuar pĂ«r njĂ« numĂ«r tĂ« pafund vlerash tĂ« numrit N (p.sh., çfarĂ«do vlerĂ« negative Ă«shtĂ« e pĂ«rshtatshme). Prandaj, mbi tĂ« nuk mund tĂ« vendosni MATERIALIZED. KĂ«shtu, kjo Ă«shtĂ« njĂ« kufizim logjik, dhe jo teknik (pra, jo sepse nuk e kemi realizuar). PĂ«r pjesĂ«n tjetĂ«r â nuk ka kufizime. Mund tĂ« pĂ«rdoren grupime, renditje, AND dhe OR, PARTITION, rekursione etj.
Për shembull, në detyrën 2.2 të artikullit të mëparshëm, mund të vendosni MATERIALIZED mbi të dy funksionet:
bleu 'Bleu' (Klienti c, Produkti p, INTEGER y) =Â
    GRUPI SHUMĂ SUM(material d) NĂSEÂ
        klienti(urdhĂ«r(d)) = c DHEÂ
        produkti(d) = p DHEÂ
        nxir vitin(data(urdhër(d))) = y MATERIALE;
vlerĂ«simi 'VlerĂ«simi' (Klienti c, Produkti p, INTEGER y) =Â
    PARTICIONI SUM 1 RENDITI ZBRITJE bleu(c, p, y), p PĂR c, y MATERIALE;
ZGJOJ kontaktEmrin(Klienti c), emrin(Produkti p) KU vlerësimi(c, p, 1997) < 3;
Sistemi do të krijojë automatikisht një tabelë me çelësa tipash Klient, Produkti dhe INTEGER, do të shtojë dy fusha në të dhe do të përditësojë vlerat në to në çdo ndryshim. Në qasjet e mëtejshme në këto funksione, nuk do të ndodhin llogaritje, por do të lexohen vlerat nga fushat përkatëse.
Me këtë mekanizëm, është e mundur, për shembull, të hiqni nevojën për rekursione (CTE) në kërkesa. Në veçanti, le të shqyrtojmë grupet që formojnë një pemë përmes marrëdhënies child/parent (çdo grup ka një lidhje me prindin e tij):
prindi = GRUPAÂ DATAÂ (Grupi);
Në bazën e të dhënave funksionale, logjikën e rekursioneve mund ta përcaktoni si më poshtë:
nivel (FĂ«mijĂ« grupi, Prind grupi) = RIKURSION 1l NĂSE fĂ«mija Ă«shtĂ« Grup dhe prindi == fĂ«mija
                                                             HAPI 2l NĂSE prindi == prindi($prindi);
Ă«shtĂ«Prind (FĂ«mijĂ« grupi, Prind grupi) = E VERTET NĂSE niveli(fĂ«mija, prindi) MATERIALIZUAR;
Duke qenë se për funksionin isParent është e vendosur MATERIALIZED, do të krijohet një tabelë me dy çelësa (grupe), në të cilën fusha isParent do të jetë e vërtetë vetëm nëse çelësi i parë është pasardhës i çelësit të dytë. Numri i regjistrimeve në këtë tabelë do të jetë i barabartë me numrin e grupeve, i shumëzuar me thellësinë mesatare të pemës. Nëse është e nevojshme, për shembull, të numërohet numri i pasardhësve të një grupi të caktuar, mund të përmendet ky funksion:
numriFĂ«mijĂ«ve (Grupi g) = GRUPI SUM 1 NĂSE Ă«shtĂ«Prind(Grupi fĂ«mijĂ«, g);
Nuk do të ketë CTE në kërkesën SQL. Në vend të kësaj, do të ketë vetëm një GROUP BY të thjeshtë.
Me këtë mekanizëm, gjithashtu mund të bëni lehtësisht denormalizimin e bazës së të dhënave kur është e nevojshme:
KLASA Porosia 'Porosi';
data 'Data' = DATA DATE (Porosia);
CLASS OrderDetail 'Rreshti i porosisë';
order 'Porosi' = DATA Order (OrderDetail);
date 'Data' (OrderDetail d) = date(order(d)) MATERIALIZED INDEXED;
Kur i referoheni funksionit date për rreshtin e porosisë do të bëhet leximi nga tabela me rreshtat e porosisë të fushës për të cilën ka një indeks. Kur ndryshohet data e porosisë, sistemi do ta rinovojë automatikisht datën denormalizuese në rresht.
Përfitimet
Për çfarë është i nevojshëm të gjithë ky mekanizëm? Në DB klasik, pa shkruar përsëri kërkesat, zhvilluesi ose DBA mund të ndryshojnë vetëm indekset, të përcaktojnë statistikat dhe të sugjerojnë planifikuesit të kërkesave se si t'i ekzekutojnë (për më tepër, HINT'ët ekzistojnë vetëm në DB komerciale). Sado që të përpiqen, ata nuk do të mund ta realizojnë kërkesën e parë në artikull për O (numri i departamenteve) pa modifikuar kërkesat dhe shtuar triggerat. Në skemën e propozuar, në fazën e zhvillimit nuk është e nevojshme të mendoni për strukturën e ruajtjes së të dhënave dhe për cilat agregacione të përdoren. Të gjithë këto mund të ndryshohen lehtësisht gjatë operimit.
Në praktikë, kjo duket kështu. Disa njerëz zhvillojnë logjikën direkt në bazë të detyrës së vendosur. Ata nuk kuptojnë aspak algoritmet dhe vështirësitë e tyre, as planet e ekzekutimit, as tipet e bashkimeve, asnjë aspekt tjetër teknik. Këta njerëz janë më shumë analistë biznesi sesa zhvillues. Më pas, gjithçka shkon për testim ose përdorim. Aktivizohet regjistrimi i kërkesave të gjata. Kur zbulohet një kërkesë e gjatë, një grup tjetër njerëzish (më teknikë - në thelb DBA) merr vendim për aktivizimin e MATERIALIZED në ndonjë funksion ndërmjetës. Kështu, shkrimi ngadalësohet pak (sepse kërkohet përditësimi i një fushe shtesë në transaksion). Megjithatë, jo vetëm që kjo kërkesë përshpejtohet, por edhe të gjitha kërkesat e tjera që përdorin këtë funksion. Në të njëjtën kohë, vendimi për cila funksion të materializohet merret relativisht lehtë. Dy parametra kryesorë: numri i vlerave të mundshme hyrëse (saktësisht kaq shumë regjistrime do të jenë në tabelën përkatëse), dhe sa shpesh përdoret ajo në funksione të tjera.
Analoge
Në sistemet moderne komerciale të menaxhimit të bazës së të dhënave, ka mekanizma të ngjashëm: MATERIALIZED VIEW me FAST REFRESH (Oracle) dhe INDEXED VIEW (Microsoft SQL Server). Në PostgreSQL, MATERIALIZED VIEW nuk mund të përditësohet në transaksion, por vetëm me kërkesë (dhe me kufizime të rrepta), prandaj nuk e shqyrtojmë. Por ata kanë disa probleme që e kufizojnë ndjeshëm përdorimin e tyre.
Së pari, materializimi mund të aktivizohet vetëm nëse keni krijuar më parë një VIEW të zakonshëm. Ndryshe, do t'ju duhet të rishkruani kërkesat e tjera për t'u drejtuar në pamjen e sapokrijuar për të përdorur këtë materializim. Ose ta lini gjithçka siç është, por do të jetë të paktën joefikas, nëse ka të dhëna të përcaktuara që janë tashmë të përllogaritura, ndërsa shumë kërkesa nuk i përdorin ato gjithmonë dhe i llogarisin nga fillimi.
Së dyti, ata kanë një numër të madh kufizimesh:
Oracle
5.3.8.4 Kufizimet e Përgjithshme për Shpejtësi të Ripërtëritjes
Kërkesa përcaktuese e pamjes së materializuar është e kufizuar si më poshtë:
- Pamja e materializuar nuk duhet të përmbajë referenca në shprehje që nuk përsëriten si
SYSDATEdheROWNUM.- Pamja e materializuar nuk duhet të përmbajë referenca në
RAWorTIPET E DHĂNAVERAW.- Ajo nuk mund tĂ« pĂ«rmbajĂ« njĂ«
SELECTnënkërkesë liste.- Ajo nuk mund të përmbajë funksione analitike (për shembuj,
RANK) nëSELECTklauzolën.- Ajo nuk mund të referohet një tabelë mbi të cilën është e caktuar një
XMLIndexindeks.- Ajo nuk mund të përmbajë një
MODELklauzolën.- Ajo nuk mund të përmbajë një
KLAUZOLà MEnënkërkesë.- Ajo nuk mund të përmbajë kërkesa të ngjashme që kanë
ĂDO,TĂ GJITHA, oseNOTEKZISTON.- Ajo nuk mund tĂ« pĂ«rmbajĂ« njĂ«
[START WITH âŠ] CONNECT BYklauzolĂ«n.- Nuk mund tĂ« pĂ«rmbajĂ« tabela tĂ« detajeve tĂ« shumta nĂ« vende tĂ« ndryshme.
POKREJTPamjet e materializuara nuk mund të kenë tabela detajesh të largëta.- Pamjet e materializuara të përfshira duhet të kenë një bashkim ose përmbledhje.
- Pamjet e bashkimit të materializuara dhe pamjet e përmbledhjes të materializuara me një
GRUPMEklauzolë nuk mund të zgjedhin nga një tabelë të organizuar me index.5.3.8.5 Kufizimet në Rrefreshin e Shpejtë në Pamje të Materializuara me Vetëm Bashkime
Këto qëllime për pamjet e materializuara me vetëm bashkime dhe pa përmbledhje kanë kufizime të mëposhtme në rrefreshin e shpejtë:
- Të gjitha kufizimet nga ««.
- Nuk mund të kenë
GRUPMEklauzola ose përmbledhje.- Rowids e të gjitha tabelave në listën e
FROMduhet të shfaqen nëSELECTlistën e kërkesës.- Regjistrat e pamjes së materializuar duhet të ekzistojnë me rowids për të gjitha tabelat bazë në
FROMlistën e kërkesës.- Nuk mund të krijoni një pamje të materializuar që refresh-het shpejt nga disa tabela me bashkime të thjeshta që përfshijnë një kolonë lloji objekt në
SELECTdeklaratën.Gjithashtu, metoda e refresh-it që zgjidhni nuk do të jetë në mënyrë optimale efikase nëse:
- Kërkesa e përcaktuar përdor një bashkim të jashtëm që funksionon si një bashkim të brendshëm. Nëse kërkesa e përcaktuar përmban një të tillë, merrni në konsideratë shkruarjen e kërkesës së përcaktuar për të përfshirë një bashkim të brendshëm.
- I
SELECTlista e pamjes së materializuar përmban shprehje mbi kolona nga tabela të shumta.5.3.8.6 Kufizimet mbi Rrefreshin e Shpejtë në Pamje të Materializuara me Përmbledhje
Kërkesat për pamjet e materializuara me përmbledhje ose bashkime kanë kufizimet e mëposhtme në rrefreshin e shpejtë:
- Të gjitha kufizimet nga ««.
Rrefreshi i shpejtë mbështetet për të dy
POKREJTdhePOKĂRKESĂpamjet e materializuara, megjithatĂ« kufizimet e mĂ«poshtme zbatohen:
- Të gjitha tabelat në pamjen e materializuar duhet të kenë regjistrat e pamjes së materializuar, dhe regjistrat e pamjes së materializuar duhet të:
- Përmbajnë të gjitha kolonat nga tabela e referencuar në pamjen e materializuar.
- Specifikoni me
ROWIDdhePĂRMBANTĂ REJAVLERAT.- Specifikoni klauzolĂ«n
SEQUENCEnëse tabela pritet të ketë një përzierje të injeksioneve/drore, fshirjeve dhe azhurnimeve.- Vetëm
SHTO,NUMRI,AVG,STDDEV,VARIANCE,MINdheMAXpërkrahën për rrefreshin e shpejtë.COUNT(*)duhet të specifikohet.- Funksionet përmbledhëse duhet të ndodhen vetëm si pjesa e jashtme e shprehjes. Kjo është, përmbledhjet si
AVG(AVG(x))orAVG(x)+AVG(x)nuk lejohet.- Për çdo përmbledhje si
AVG(expr), përkatësishtCOUNT(expr)duhet të jetë e pranishme. Oracle rekomandon qëSHTO(expr)duhet të specifikohet.- Nëse
VARIANCE(expr)orSTDDEV(expr) është specifikuar,COUNT(expr)dheSHTO(expr)duhet të specifikohet. Oracle rekomandon qëSHTO(expr *expr)duhet të specifikohet.- I
SELECTkolona në kërkesën e përcaktuar nuk mund të jetë një shprehje komplekse me kolona nga tabela të shumta bazë. Një zgjidhje e mundshme për këtë është të përdorni një pamje të materializuar të vendosur.- I
SELECTlista duhet të përmbajë të gjithaGRUPMEkolonat.- Pamja e materializuar nuk është e bazuar në një ose më shumë tabela të largëta.
- Nëse përdorni një
CHARtip të dhënash në kolonat filtrues të një regjistri të pamjes së materializuar, setet e karaktereve të vendit master dhe pamjes së materializuar duhet të jenë të njëjta.- Nëse pamja e materializuar ka një nga të mëposhtmet, atëherë rrefreshi i shpejtë mbështetet vetëm për injeksionet DML konvencionale dhe ngarkesa të drejtpërdrejta.
- Pamjet e materializuara me
MINorMAXpërmbledhje- Pamjet e materializuara që kanë
SHTO(expr)por paCOUNT(expr)- Pamjet e materializuara pa
COUNT(*)Një pamje e tillë e materializuar quhet pamja e materializuar e injeksioneve vetëm.
- Një pamje e materializuar me
MAXorMINështë e ripërtrirë shpejt pas fshirjes ose deklaratave DML të përziera nëse nuk ka njëKUklauzolën.
Max/min rrefreshi shpejt pas fshirjes ose DML të përziera nuk ka të njëjtin funksion si rasti i injeksioneve vetëm. Ai fshin dhe rërrethon përsëri vlerat maksimum/minimum për grupet e prekura. Duhet të jeni të vetëdijshëm për ndikimin e tij në performancë.- Pamjet e materializuara me pamje të emëruara ose nënkërkesa në klauzolë mund të rrefreshohen shpejt nëse pamjet mund të bashkohen plotësisht. Për informacion mbi cilat pamje do të bashkohen, shih
FROMReferenca e Gjuhës SQL të Oracle Database .- Nëse nuk ka bashkëngjitje të jashtme, mund të keni seleksione dhe bashkëngjitje arbitrare në
KUklauzolën.- Shikimet e agreguara të materializuara me bashkime të jashtme janë të shpejta për ripërtëritje pas DML konvencionale dhe ngarkimeve direkte, me kusht që vetëm tabela e jashtme të ketë qenë e modifikuar. Gjithashtu, duhet të ekzistojnë kufizime unike mbi kolonnat e bashkimeve të tabelës së brendshme.
DHEdhe duhet të përdorin barazinë (=) operator.- Për shikimet materializuara me
CUBE,ROLLUP, grupe përcaktuese, ose bashkimin e tyre, zbatohen kufizime të mëposhtme:
- I
SELECTlista duhet të përmbajë ndarës grumbullimi që mund të jetë ose njëGROUPING_IDfunksion mbi të gjithaGRUPMEshprehjet oseGRUPIMfunksione, një për çdoGRUPMEshprehje. Për shembull, nëseGRUPMEklauzola e shikimit materializuar është «GRUPMECUBE(a, b)«, atëherë lista duhet të përmbajë ose «SELECTGROUPING_ID(a, b)» ose «GROUPING(a)GROUPING(b)DHE» për shikimin materializuar për të qenë i shpejtë në ripërtëritje.nuk duhet të rezultojë në asnjë grumbullim të dyfishtë. Për shembull, «GRUPMEGROUP BY a, ROLLUP(a, b)» nuk është i shpejtë në ripërtëritje sepse rezulton në grumbullime të dyfishta «(a), (a, b), DHE (a)5.3.8.7 Kufizimet në Ripërtëritje të Shpejtë mbi Shikimet Materializuara me UNION ALL«.Shikimet materializuara me
operatori i grumbullit mbështet opsionin
UNIONTĂ GJITHARIPĂRTĂRITĂ SHPEJTĂnĂ«se kushtet e mĂ«poshtme plotĂ«sohen:KĂ«rkesa e pĂ«rcaktimit duhet tĂ« ketĂ«
- operatori në nivelin e lartë.
UNIONTĂ GJITHAoperatori nuk mund tĂ« jetĂ« i vendosur brenda njĂ« nĂ«n-kĂ«rkese, me njĂ« pĂ«rjashtim:ÂI
UNIONTĂ GJITHAmund tĂ« jetĂ« nĂ« njĂ« nĂ«n-kĂ«rkese nĂ«UNIONTĂ GJITHAklauzolĂ«n pĂ«r sa kohĂ« qĂ« kĂ«rkesa e pĂ«rcaktimit Ă«shtĂ« nĂ« formĂ«nFROMSELECT * FROM(shikim ose nĂ«n-kĂ«rkesĂ« me) si nĂ« shembullin e mĂ«poshtĂ«m:UNIONTĂ GJITHACREO SHIKIM shikim_me_unionall AS (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');CREO SHIKIM TĂ MATERIALIZUAR unionall_brenda_view_mv RIPĂRTĂRI TĂ SHPEJTĂ NĂ KERKESĂ SI SELECT * FROM shikim_me_unionall;Kujdes, shikimishikim_me_unionall
plotĂ«son kĂ«rkesat pĂ«r ripĂ«rtĂ«ritje tĂ« shpejtĂ«.Ădo bllok kĂ«rkese nĂ«- kĂ«rkesĂ« duhet tĂ« plotĂ«sojĂ« kĂ«rkesat e njĂ« shikimi materializuar tĂ« shpejtĂ« nĂ« ripĂ«rtĂ«ritje me agregate ose njĂ« shikimi materializuar tĂ« shpejtĂ« nĂ« ripĂ«rtĂ«ritje me bashkime.
UNIONTà GJITHALogët e shikimeve materializuara përkatëse duhet të krijohen mbi tabelat siç kërkohet për llojin përkatës të shikimeve materializuara të shpejta në ripërtëritje.Kujdes, gjithashtu Oracle Database lejon rastin special të një shikimi materializuar me një tabelë të vetme me bashkime vetëm nëse
kolona është përfshirë nëROWIDlistë dhe në logun e shikimit materializuar. Kjo tregohet në kërkesën përcaktuese të shikimitSELECTlista e çdo kërkese duhet të përfshijë njëplotëson kërkesat për ripërtëritje të shpejtë..- I
SELECTmarker, dheUNIONTĂ GJITHAkolona duhet tĂ« ketĂ« njĂ« vlerĂ« konstante numerike ose string tĂ« veçantĂ« nĂ« çdoUNIONTĂ GJITHAdege. PĂ«r mĂ« tepĂ«r, kolona e markerit duhet tĂ« shfaqet nĂ« tĂ« njĂ«jtĂ«n pozitĂ« ordinal nĂ«UNIONTĂ GJITHAlistĂ«n e çdo blloku kĂ«rkese. Shih «SELECTMARKER TĂ UNION ALL dhe RISHKRUAR KĂRKESATmarkerit.UNIONTĂ GJITHADisa karakteristika si bashkimet e jashtme, kĂ«rkesat pĂ«r shikimet materializuara me agregate qĂ« janĂ« vetĂ«m pĂ«r_insert dhe tabelat e largĂ«ta nuk mbĂ«shteten pĂ«r shikimet materializuara me- . Kujdes, megjithatĂ«, shikimet materializuara tĂ« pĂ«rdorura nĂ« replikim, tĂ« cilat nuk pĂ«rmbajnĂ« bashkime ose agregate, mund tĂ« ripĂ«rtĂ«rihen shpejt kur
UNIONTà GJITHAose tabelat e largëta përdoren.UNIONTà GJITHAParametri për fillimin e kompatibilitetit duhet të jetë i vendosur në 9.2.0 ose më sipër për të krijuar një shikim materializuar të ripërtëritshëm shpejt me- Parametri i iniciimit të përputhshmërisë duhet të vendoset në 9.2.0 ose më të lartë për të krijuar një pamje të materializuar që rifreskohet shpejt me
UNIONTĂ GJITHA.
Nuk dĂ«shiroj tĂ« ofendoj adhuruesit e Oracle, por sipas listĂ«s sĂ« tyre tĂ« kufizimeve, duket se ky mekanizĂ«m Ă«shtĂ« shkruar jo nĂ« njĂ« rast tĂ« pĂ«rgjithshĂ«m, duke pĂ«rdorur ndonjĂ« model, por nga mijĂ«ra indianĂ«, ku secilit iu dha mundĂ«sia tĂ« shkruajĂ« degĂ«n e tij, dhe çdo njeri bĂ«ri çfarĂ« mundi. PĂ«rdorimi i kĂ«tij mekanizmi pĂ«r logjikĂ«n reale Ă«shtĂ« sikur tĂ« ecĂ«sh nĂ« njĂ« fushĂ« mine. Ădo moment mund tĂ« gjesh njĂ« minĂ«, duke rĂ«nĂ« nĂ« njĂ« nga kufizimet e pabesueshme. Si funksionon kjo Ă«shtĂ« njĂ« pyetje tjetĂ«r, por ajo Ă«shtĂ« jashtĂ« kuadrit tĂ« kĂ«tij artikulli.
Microsoft SQL Server
Kërkesat Shtesë
Përveç kërkesave për opsionet SET dhe funksionet e përcaktuara, duhet të përmbushen kërkesat e mëposhtme:
- Përdoruesi që ekzekuton
KRIJO INDĂKSduhet tĂ« jetĂ« pronari i pamjes.- Kur krijoni indeksin, opsioni
IGNORE_DUP_KEYduhet të jetë vendosur në OFF (caktimi i parazgjedhur).- Të dhënat duhet të referohen me emra me dy pjesë, schema.emri_tabelës në përkufizimin e pamjes.
- Funksionet e përdoruesve të përcaktuara që referohen në pamje duhet të krijohen duke përdorur
ME BINDJE_SCHEMATICopsioni.- Ădo funksion i pĂ«rdoruesit tĂ« pĂ«rcaktuar qĂ« referohet nĂ« pamje duhet tĂ« referohet me emra me dy pjesĂ«, <schema>.<function>.
- Prona e qasjes në të dhëna e një funksioni të përdoruesit të përcaktuar duhet të jetë
PA SQL, dhe prona e qasjes së jashtme duhet të jetëJO.- Funksionet e mjedisit të përbashkët (CLR) mund të shfaqen në listën e zgjedhjes së pamjes, por nuk mund të jenë pjesë e përkufizimit të çelësit të indekseve të grumbulluara. Funksionet CLR nuk mund të shfaqen në klauzolën WHERE të pamjes ose klauzolën ON të një operacioni JOIN në pamje.
- Funksionet dhe metodat e tipeve të përdoruesve të përcaktuar CLR të përdorur në përkufizimin e pamjes duhet të kenë pronat e vendosura siç është treguar në tabelën e mëposhtme.
Pronë
NoteDETERMINISTIK = PO
Duhet të shpallet eksplicitisht si një atribut i metodës Microsoft .NET Framework.PRECIZ = PO
Duhet tĂ« shpallet eksplicitisht si njĂ« atribut i metodĂ«s .NET Framework.QASJA NĂ TĂ DHĂNA = PA SQL
E përcaktuar duke vendosur atributin DataAccess në DataAccessKind.None dhe atributin SystemDataAccess në SystemDataAccessKind.None.QASJA E JASHTME = JO
Ky atribut është parazgjedhur në JO për rutinat CLR.- Pamja duhet të krijohet duke përdorur
ME BINDJE_SCHEMATICopsioni.- Pamja duhet të referohet vetëm tabelave bazë që janë në të njëjtin bazë të të dhënave me pamjen. Pamja nuk mund të referojë pamje të tjera.
- Deklarata SELECT në përkufizimin e pamjes nuk duhet të përmbajë elementet e mëposhtme T-SQL:
NUMRI
funksionet ROWSET (OPENDATASOURCE,OPENQUERY,OPENROWSET, DHEOPENXML)
JONET E JASHTME (E MAJTĂE DJATHTĂ,Tabela e derivuar (e cila pĂ«rcaktohet duke specifikuar njĂ«, oseFULL)deklaratĂ«s nĂ« klauzolĂ«n
SELECTVetë-ndërlidhjetFROMSpecifikimi i kolonave duke përdorur
SELECT *
SELECT .*STDEVorSTDEVP
DISTINCT
VAR,VARP,Shprehja e tabelës së zakonshme (CTE),float, oseAVG
ntextfilestream1, text, kolona, image, XML, ose Nënpyetje MBI
klauzolë, e cila përfshin funksione dritaruese ose agregate
PĂ«rdorimet e tekstit tĂ« plotĂ« (PĂRMBANFREETEXT
funksioni që referon një shprehje të mundshme,funksioni agregat i përdoruesve të përcaktuar CLR)
SHTOMAJ
ORDER BYGRUPIM SETET
operatorët
CUBE,ROLLUP, osePĂRBASHKIMNĂ GJDHE
MIN,MAX
UNION,MUE TABELATAMPLE, oseTë dhënat e tabelaveNà GJDHE
APLIKIM I JASHTĂMAPLIKIM NĂ CROSS
TABELAorMIRATIM
PIVOT,PIVOTGrupet e kolonave sparse
Funksionet e tipit të tabelës inline (TVF) ose funksionet e tipit të tabelës me shumë deklarata (MSTVF)
OFFSET
CHECKSUM_AGG1 Pamja e indekseve mund të përmbajë filestream kolona; megjithatë, këto kolona nuk mund të përfshihen në çelësin e indekseve të grumbulluara.
- Nëse
GRUPIM NGAështë e pranishme, përkufizimi i PAMJES duhet të përmbajëCOUNT_BIG(*)dhe nuk duhet të përmbajëKLAUZOLà ME. KëtoGRUPIM NGAkufizime janë të aplikueshme vetëm për përkufizimin e pamjes së indekseve. Një pyetje mund të përdorë një pamje të indekseve në planin e ekzekutimit edhe nëse nuk përmbush këtoGRUPIM NGAkufizime.- Nëse përkufizimi i pamjes përmban një
GRUPIM NGAklauzolë, çelësi i indekseve të unike të grumbulluara mund të referojë vetëm kolonat e specifikuara nëGRUPIM NGAklauzolën.
KĂ«tu shihet se indianĂ«t nuk ishin tĂ«rhequr, pasi ata vendosĂ«n tĂ« punojnĂ« sipas skemĂ«s âdo tĂ« bĂ«jmĂ« pak, por mirĂ«â. Kjo do tĂ« thotĂ« se ata kanĂ« mĂ« shumĂ« miniera nĂ« fushĂ«, por pozita e tyre Ă«shtĂ« mĂ« e qartĂ«. MĂ« shumĂ« se çdo gjĂ« mĂ« shqetĂ«son kjo kufizim:
Pamja duhet të referohet vetëm tabelave bazë që janë në të njëjtin bazë të të dhënave me pamjen. Pamja nuk mund të referojë pamje të tjera.
Në terminologjinë tonë, kjo do të thotë se funksioni nuk mund të thërrasë një funksion tjetër të materializuar. Kjo e prish të gjithë ideologjinë në rrënjë.
Po ashtu, ky kufizim (dhe më tej në tekst) zvogëlon shumë mundësitë e përdorimit:
Deklarata SELECT në përkufizimin e pamjes nuk duhet të përmbajë elementet e mëposhtme T-SQL:
NUMRI
funksionet ROWSET (OPENDATASOURCE,OPENQUERY,OPENROWSET, DHEOPENXML)
JONET E JASHTME (E MAJTĂE DJATHTĂ,Tabela e derivuar (e cila pĂ«rcaktohet duke specifikuar njĂ«, oseFULL)deklaratĂ«s nĂ« klauzolĂ«n
SELECTVetë-ndërlidhjetFROMSpecifikimi i kolonave duke përdorur
SELECT *
SELECT .*STDEVorSTDEVP
DISTINCT
VAR,VARP,Shprehja e tabelës së zakonshme (CTE),float, oseAVG
ntextfilestream1, text, kolona, image, XML, ose Nënpyetje MBI
klauzolë, e cila përfshin funksione dritaruese ose agregate
PĂ«rdorimet e tekstit tĂ« plotĂ« (PĂRMBANFREETEXT
funksioni që referon një shprehje të mundshme,funksioni agregat i përdoruesve të përcaktuar CLR)
SHTOMAJ
ORDER BYGRUPIM SETET
operatorët
CUBE,ROLLUP, osePĂRBASHKIMNĂ GJDHE
MIN,MAX
UNION,MUE TABELATAMPLE, oseTë dhënat e tabelaveNà GJDHE
APLIKIM I JASHTĂMAPLIKIM NĂ CROSS
TABELAorMIRATIM
PIVOT,PIVOTGrupet e kolonave sparse
Funksionet e tipit të tabelës inline (TVF) ose funksionet e tipit të tabelës me shumë deklarata (MSTVF)
OFFSET
CHECKSUM_AGG
OUTER JOINS, UNION, ORDER BY dhe të tjera janë të ndaluara. Ndoshta do të ishte më e lehtë të tregohej se çfarë mund të përdoret, sesa çfarë nuk mund të përdoret. Lista ndoshta do të ishte shumë më e vogël.
Duke përmbledhur: një set i madh kufizimesh në çdo (të cilin e theksoj komercial) SGBD përballë asnjë (përveç një logjike, e jo teknike) në teknologjinë LGPL. Megjithatë, duhet vënë në dukje se implementimi i këtij mekanizmi në logjikën relationale është paksa më i ndërlikuar se sa në logjikën funksionale të përshkruar.
Implementimi
Si funksionon kjo? Si âmakinĂ« virtualeâ pĂ«rdoret PostgreSQL. Brenda saj ndodhet njĂ« algoritĂ«m i ndĂ«rlikuar, i cili merret me ndĂ«rtimin e kĂ«rkesave. Ja . Dhe atje nuk ka vetĂ«m njĂ« set tĂ« madh heuristikash me shumĂ« ifâĂ«. Pra, nĂ«se keni disa muaj pĂ«r tĂ« studiuar, mund tĂ« provoni tĂ« kuptoni arkitekturĂ«n.
A funksionon kjo efikasisht? Mjaft efikase. Fatkeqësisht, është e vështirë ta provohet këtë. Mund të them vetëm se nëse shqyrtohet mijëra kërkesat që ka në aplikacione të mëdha, atëherë në mesatare ato janë më efikase se ato të një zhvilluesi të mirë. Një programues i shkëlqyer SQL mund të shkruajë çdo kërkesë më efikaste, por në mijëra kërkesa ai thjesht nuk do të ketë motivim as kohë për ta bërë këtë. E vetmja gjë që mund të jap si provë aktuale të efikasitetit është se mbi platformën e ndërtuar mbi këtë SGBD punojnë disa projekte , në të cilat ka mijëra funksione MATERIALIZED të ndryshme, me mijëra përdorues dhe baza terabajtësh me qindra milionë regjistrime, që punojnë në një server të zakonshëm me dy procesorë. Megjithatë, kushdo që dëshiron mund të verifikojë / të mohojë efikasitetin, duke shkarkuar dhe PostgreSQL, regjistrimin e kërkesave SQL dhe duke provuar të ndryshojë logjikën dhe të dhënat.
Në artikujt e ardhshëm, do të flas gjithashtu për mënyrën si mund të vendosen kufizime mbi funksionet, punën me seancat e ndryshimeve dhe shumë të tjera.
Burimi: habr.com
