Bilanċ jikteb u jaqra f'database

Bilanċ jikteb u jaqra f'database
Fil-preċedenti artikolu Iddeskrivejt il-kunċett u l-implimentazzjoni ta 'database mibnija fuq il-bażi ta' funzjonijiet, aktar milli tabelli u oqsma bħal f'databases relazzjonali. Hija pprovdiet ħafna eżempji li juru l-vantaġġi ta 'dan l-approċċ fuq dak klassiku. Ħafna sabuhom mhux konvinċenti biżżejjed.

F'dan l-artikolu, ser nuri kif dan il-kunċett jippermettilek li tibbilanċja malajr u b'mod konvenjenti l-kitba u l-qari fid-database mingħajr ebda bidla fil-loġika operattiva. Funzjonalità simili ġiet ippruvata biex tiġi implimentata f'DBMSs kummerċjali moderni (b'mod partikolari, Oracle u Microsoft SQL Server). Fl-aħħar tal-artiklu se nuri li dak li għamlu, biex ngħiduha ħafif, ma ħadimx tajjeb ħafna.

Deskrizzjoni

Bħal qabel, għal fehim aħjar se nibda d-deskrizzjoni b'eżempji. Ejja ngħidu li għandna bżonn nimplimentaw loġika li tirritorna lista ta 'dipartimenti bin-numru ta' impjegati fihom u s-salarju totali tagħhom.

F'database funzjonali tkun tidher bħal din:

CLASS Department ‘Отдел’;
name ‘Наименование’ = DATA STRING[100] (Department);

CLASS Employee ‘Сотрудник’;
department ‘Отдел’ = DATA Department (Employee);
salary ‘Зарплата’ =  DATA NUMERIC[10,2] (Employee);

countEmployees ‘Кол-во сотрудников’ (Department d) = 
    GROUP SUM 1 IF department(Employee e) = d;
salarySum ‘Суммарная зарплата’ (Department d) = 
    GROUP SUM salary(Employee e) IF department(e) = d;

SELECT name(Department d), countEmployees(d), salarySum(d);

Il-kumplessità tal-eżekuzzjoni ta' din il-mistoqsija fi kwalunkwe DBMS tkun ekwivalenti għal O (numru ta' impjegati)għax dan il-kalkolu jeħtieġ li tiskennja t-tabella kollha tal-impjegati u mbagħad tiġborhom skont id-dipartiment. Se jkun hemm ukoll xi suppliment żgħir (nemmnu li hemm ħafna aktar impjegati milli dipartimenti) skont il-pjan magħżul O (numru log ta' impjegati) jew O (numru ta' dipartimenti) għall-grupp u l-bqija.

Huwa ċar li l-overhead ta 'eżekuzzjoni jista' jkun differenti f'DBMSs differenti, iżda l-kumplessità ma tinbidel bl-ebda mod.

Fl-implimentazzjoni proposta, id-DBMS funzjonali se jiġġenera subquery waħda li tikkalkula l-valuri meħtieġa għad-dipartiment, u mbagħad tagħmel JOIN mat-tabella tad-dipartiment biex tikseb l-isem. Madankollu, għal kull funzjoni, meta tiddikjara, huwa possibbli li jiġi stabbilit markatur speċjali MATERJALIZZAT. Is-sistema awtomatikament toħloq qasam korrispondenti għal kull funzjoni bħal din. Meta tbiddel il-valur ta 'funzjoni, il-valur tal-qasam jinbidel ukoll fl-istess transazzjoni. Meta taċċessa din il-funzjoni, se jkun hemm aċċess għall-qasam ikkalkulat minn qabel.

B'mod partikolari, jekk issettja MATERIALIZED għal funzjonijiet countEmployees и salarjuSum, imbagħad żewġ oqsma se jiżdiedu mat-tabella bil-lista ta 'dipartimenti, li se jaħżnu n-numru ta' impjegati u s-salarju totali tagħhom. Kull meta jkun hemm bidla fl-impjegati, is-salarji tagħhom jew l-affiljazzjonijiet tad-dipartimenti, is-sistema awtomatikament tbiddel il-valuri ta 'dawn l-oqsma. Il-mistoqsija ta' hawn fuq se taċċessa dawn l-oqsma direttament u se titwettaq fi O (numru ta' dipartimenti).

X'inhuma r-restrizzjonijiet? Ħaġa waħda biss: funzjoni bħal din għandu jkollha numru finit ta 'valuri ta' input li għalihom il-valur tagħha huwa definit. Inkella, ikun impossibbli li tinbena tabella li taħżen il-valuri kollha tagħha, peress li ma jistax ikun hemm tabella b'numru infinit ta 'ringieli.

Eżempju:

employeesCount ‘Количество сотрудников с зарплатой > N’ (Department d, NUMERIC[10,2] N) = 
    GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;

Din il-funzjoni hija definita għal numru infinit ta 'valuri ta' N (per eżempju, kwalunkwe valur negattiv huwa adattat). Għalhekk, ma tistax tpoġġi MATERJALIZZATA fuqha. Allura din hija limitazzjoni loġika, mhux waħda teknika (jiġifieri, mhux għax ma stajniex nimplimentawha). Inkella, m'hemm l-ebda restrizzjonijiet. Tista' tuża raggruppamenti, issortjar, AND u JEW, PARTITION, rikorżjoni, eċċ.

Pereżempju, fil-problema 2.2 tal-artikolu preċedenti, tista 'tpoġġi MATERJALIZZATA fuq iż-żewġ funzjonijiet:

bought 'Купил' (Customer c, Product p, INTEGER y) = 
    GROUP SUM sum(Detail d) IF 
        customer(order(d)) = c AND 
        product(d) = p AND 
        extractYear(date(order(d))) = y MATERIALIZED;
rating 'Рейтинг' (Customer c, Product p, INTEGER y) = 
    PARTITION SUM 1 ORDER DESC bought(c, p, y), p BY c, y MATERIALIZED;
SELECT contactName(Customer c), name(Product p) WHERE rating(c, p, 1997) < 3;

Is-sistema nnifisha se toħloq tabella waħda b'ċwievet tat-tip Klijent, prodott и INTEGER, se żżid żewġ oqsma magħha u se taġġorna l-valuri tal-kamp fihom bi kwalunkwe tibdil. Meta jsiru aktar sejħiet għal dawn il-funzjonijiet, dawn mhux se jiġu kkalkulati, iżda pjuttost il-valuri jinqraw mill-oqsma korrispondenti.

Bl-użu ta 'dan il-mekkaniżmu, tista', pereżempju, teħles mir-rikorsi (CTE) fil-mistoqsijiet. B'mod partikolari, ikkunsidra gruppi li jiffurmaw siġra billi tuża r-relazzjoni tat-tfal/ġenitur (kull grupp għandu link mal-ġenitur tiegħu):

parent = DATA Group (Group);

F'database funzjonali, il-loġika tar-rikorsjoni tista' tiġi speċifikata kif ġej:

level (Group child, Group parent) = RECURSION 1l IF child IS Group AND parent == child
                                                             STEP 2l IF parent == parent($parent);
isParent (Group child, Group parent) = TRUE IF level(child, parent) MATERIALIZED;

Peress li għall-funzjoni isParent hija mmarkata MATERJALIZZATA, allura tinħoloq tabella b'żewġ ċwievet (gruppi) għaliha, li fiha l-field isParent ikun veru biss jekk l-ewwel ċavetta hija tifel tat-tieni. In-numru ta' entrati f'din it-tabella se jkun ugwali għan-numru ta' gruppi mmultiplikat bil-fond medju tas-siġra. Jekk għandek bżonn, pereżempju, tgħodd in-numru ta 'dixxendenti ta' ċertu grupp, tista 'tuża din il-funzjoni:

childrenCount (Group g) = GROUP SUM 1 IF isParent(Group child, g);

Mhux se jkun hemm CTE fil-mistoqsija SQL. Minflok se jkun hemm sempliċi GROUP BY.

Billi tuża dan il-mekkaniżmu, tista 'wkoll faċilment tiddenormalizza d-database jekk meħtieġ:

CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);

CLASS OrderDetail 'Строка заказа';
order 'Заказ' = DATA Order (OrderDetail);
date 'Дата' (OrderDetail d) = date(order(d)) MATERIALIZED INDEXED;

Meta ssejjaħ funzjoni data għal-linja tal-ordni, il-qasam li għalih hemm indiċi se jinqara mit-tabella bil-linji tal-ordni. Meta d-data tal-ordni tinbidel, is-sistema nnifisha awtomatikament terġa 'tikkalkula d-data denormalizzata fil-linja.

Vantaġġi

Għal xiex hu dan il-mekkaniżmu kollu? F'DBMSs klassiċi, mingħajr kitba mill-ġdid tal-mistoqsijiet, żviluppatur jew DBA jista 'biss jibdel l-indiċi, jiddetermina l-istatistika u jgħid lill-pjanifikatur tal-mistoqsijiet kif jesegwixxihom (u HINTs huma disponibbli biss f'DBMSs kummerċjali). Jippruvaw kemm huma, ma jkunux jistgħu jlestu l-ewwel mistoqsija fl-artiklu fi O (numru ta' dipartimenti) mingħajr ma tbiddel il-mistoqsijiet jew iżżid triggers. Fl-iskema proposta, fl-istadju tal-iżvilupp m'għandekx għalfejn taħseb dwar l-istruttura tal-ħażna tad-dejta u liema aggregazzjonijiet tuża. Dan kollu jista 'jinbidel faċilment fuq il-fly, direttament fl-operazzjoni.

Fil-prattika jidher bħal dan. Xi nies jiżviluppaw loġika direttament ibbażata fuq il-kompitu fil-idejn. Ma jifhmux l-algoritmi u l-kumplessità tagħhom, la pjanijiet ta 'eżekuzzjoni, la tipi ta' tingħaqad, u lanqas xi komponent tekniku ieħor. Dawn in-nies huma aktar analisti tan-negozju milli żviluppaturi. Imbagħad, dan kollu jidħol fl-ittestjar jew fl-operazzjoni. Jippermetti l-illoggjar ta' mistoqsijiet fit-tul. Meta tiġi skoperta mistoqsija twila, allura nies oħra (aktar tekniċi - essenzjalment DBA) jiddeċiedu li jippermettu MATERIALIZED fuq xi funzjoni intermedja. Dan inaqqas xi ftit ir-reġistrazzjoni (peress li jeħtieġ l-aġġornament ta' qasam addizzjonali fit-tranżazzjoni). Madankollu, mhux biss din il-mistoqsija titħaffef b'mod sinifikanti, iżda wkoll l-oħrajn kollha li jużaw din il-funzjoni. Fl-istess ħin, li tiddeċiedi liema funzjoni timmaterjalizza hija relattivament faċli. Żewġ parametri ewlenin: in-numru ta 'valuri ta' input possibbli (dan huwa kemm se jkun hemm rekords fit-tabella korrispondenti), u kemm-il darba jintuża f'funzjonijiet oħra.

Analogi

Id-DBMSs kummerċjali moderni għandhom mekkaniżmi simili: DEHIR MATERJALIZZATA b'FAST REFRESH (Oracle) u DEVISTA INDIĊJATA (Microsoft SQL Server). F'PostgreSQL, MATERIALIZED VIEW ma tistax tiġi aġġornata fi tranżazzjoni, iżda biss fuq talba (u anke b'restrizzjonijiet stretti ħafna), għalhekk ma nqisux dan. Iżda għandhom diversi problemi li jillimitaw b'mod sinifikanti l-użu tagħhom.

L-ewwelnett, tista 'tippermetti l-materjalizzazzjoni biss jekk diġà ħloqt VISTA regolari. Inkella, ikollok tikteb mill-ġdid it-talbiet li fadal biex taċċessa l-veduta maħluqa ġdida biex tuża din il-materjalizzazzjoni. Jew ħalli kollox kif inhu, iżda mill-inqas ikun ineffettiv jekk ikun hemm ċerta data diġà kkalkulata minn qabel, iżda ħafna mistoqsijiet mhux dejjem jużawha, iżda jerġgħu jikkalkulawha.

It-tieni nett, għandhom numru kbir ta 'restrizzjonijiet:

Oracle

5.3.8.4 Restrizzjonijiet Ġenerali fuq Aġġornament Mgħaġġel

Il-mistoqsija li tiddefinixxi l-veduta materjalizzata hija ristretta kif ġej:

  • Il-veduta mmaterjalizzata m'għandux ikun fiha referenzi għal espressjonijiet li ma jirrepetux bħal SYSDATE u, ROWNUM.
  • Il-veduta mmaterjalizzata m'għandux ikun fiha referenzi għal RAW or LONG RAW tipi ta' data.
  • Ma jistax ikun fih a SELECT lista subquery.
  • Ma jistax ikun fih funzjonijiet analitiċi (per eżempju, RANK) ġol SELECT klawżola.
  • Ma jistax jirreferi għal tabella li fuqha an XMLIndex indiċi huwa definit.
  • Ma jistax ikun fih a MODEL klawżola.
  • Ma jistax ikun fih a HAVING klawsola b'subquery.
  • Ma jistax ikun fih mistoqsijiet nested li għandhom ANY, ALL, Jew NOT EXISTS.
  • Ma jistax ikun fih a [START WITH …] CONNECT BY klawżola.
  • Ma jistax ikun fih tabelli ta' dettalji multipli f'siti differenti.
  • ON COMMIT veduti mmaterjalizzati ma jistgħux ikollhom tabelli dettall remoti.
  • Fehmiet immaterjalizzati mgħaqqdin għandu jkollhom joint jew aggregate.
  • Fehmiet li jingħaqdu mmaterjalizzati u fehmiet aggregati mmaterjalizzati b'a GROUP BY klawsola ma tistax tagħżel minn tabella organizzata bl-indiċi.

5.3.8.5 Restrizzjonijiet fuq Aġġornament Mgħaġġel fuq Veduti Materjalizzati b'Joins Biss

Id-definizzjoni ta' mistoqsijiet għal fehmiet materjalizzat b'għaqdiet biss u l-ebda aggregati għandhom ir-restrizzjonijiet li ġejjin dwar l-aġġornament mgħaġġel:

  • Ir-restrizzjonijiet kollha minn «Restrizzjonijiet Ġenerali fuq Aġġornament Mgħaġġel".
  • Ma jistgħux ikollhom GROUP BY klawsoli jew aggregati.
  • Ringieli tat-tabelli kollha fil- FROM lista trid tidher fil- SELECT lista tal-mistoqsija.
  • Ir-reġistri tal-vista mmaterjalizzati għandhom jeżistu b'rowids għat-tabelli bażi kollha fil- FROM lista tal-mistoqsija.
  • Ma tistax toħloq ħarsa mgħaġġla mmaterjalizzata li tista' tiġi aġġornata minn tabelli multipli b'joqsijiet sempliċi li jinkludu kolonna tat-tip ta' oġġett fil- SELECT Stqarrija.

Barra minn hekk, il-metodu ta’ aġġornament li tagħżel mhux se jkun effiċjenti bl-aħjar mod jekk:

  • Il-mistoqsija li tiddefinixxi tuża join outer li jġib ruħu bħal inner join. Jekk il-mistoqsija li tiddefinixxi fiha tali join, ikkunsidra tikteb mill-ġdid il-mistoqsija li tiddefinixxi biex ikun fiha inner join.
  • il SELECT lista tal-veduta mmaterjalizzata fiha espressjonijiet fuq kolonni minn tabelli multipli.

5.3.8.6 Restrizzjonijiet fuq Aġġornament Mgħaġġel fuq Veduti Materjalizzati b'Aggregati

Id-definizzjoni ta' mistoqsijiet għal veduti mmaterjalizzati b'aggregati jew tgħaqqid għandhom ir-restrizzjonijiet li ġejjin dwar l-aġġornament mgħaġġel:

Aġġornament mgħaġġel huwa appoġġjat għat-tnejn ON COMMIT u, ON DEMAND fehmiet materjali, madankollu japplikaw ir-restrizzjonijiet li ġejjin:

  • It-tabelli kollha fil-veduta mmaterjalizzata għandu jkollhom zkuk tal-vista mmaterjalizzati, u r-zkuk tal-vista mmaterjalizzati għandhom:
    • Fihom il-kolonni kollha mit-tabella referenzjata fil-veduta materjalizzata.
    • Speċifika ma ROWID u, INCLUDING NEW VALUES.
    • Speċifika l- SEQUENCE klawsola jekk it-tabella hija mistennija li jkollha taħlita ta’ inserzjonijiet/tagħbijiet diretti, tħassir, u aġġornamenti.

  • biss SUM, COUNT, AVG, STDDEV, VARIANCE, MIN u, MAX huma appoġġjati għal aġġornament mgħaġġel.
  • COUNT(*) għandhom jiġu speċifikati.
  • Il-funzjonijiet aggregati għandhom iseħħu biss bħala l-parti l-aktar 'il barra tal-espressjoni. Jiġifieri, aggregati bħal AVG(AVG(x)) or AVG(x)+ AVG(x) mhumiex permessi.
  • Għal kull aggregat bħal AVG(expr), il-korrispondenti COUNT(expr) iridu jkunu preżenti. Oracle jirrakkomanda li SUM(expr) jiġu speċifikati.
  • If VARIANCE(expr) or STDDEV(expr) hija speċifikata, COUNT(expr) u, SUM(expr) għandhom jiġu speċifikati. Oracle jirrakkomanda li SUM(expr *expr) jiġu speċifikati.
  • il SELECT kolonna fil-mistoqsija li tiddefinixxi ma tistax tkun espressjoni kumplessa b'kolonni minn tabelli bażi multipli. Soluzzjoni possibbli għal dan huwa l-użu ta 'veduta mmaterjalizzata nested.
  • il SELECT lista għandu jkun fiha kollha GROUP BY kolonni.
  • Il-veduta mmaterjalizzata mhix ibbażata fuq tabelli remoti waħda jew aktar.
  • Jekk tuża a CHAR tip ta 'dejta fil-kolonni tal-filtru ta' log tal-vista mmaterjalizzata, is-settijiet ta 'karattri tas-sit prinċipali u l-veduta mmaterjalizzata għandhom ikunu l-istess.
  • Jekk il-veduta mmaterjalizzata għandha waħda minn dawn li ġejjin, allura l-aġġornament mgħaġġel huwa appoġġjat biss fuq inserzjonijiet DML konvenzjonali u tagħbijiet diretti.
    • Fehmiet materjalizzat ma MIN or MAX aggregati
    • Fehmiet materjalizzati li għandhom SUM(expr) imma le COUNT(expr)
    • Fehmiet materjalizzat mingħajr COUNT(*)

    Tali dehra mmaterjalizzata tissejjaħ veduta mmaterjalizzata biss.

  • Veduta mmaterjalizzata ma MAX or MIN huwa fast refreshable wara dikjarazzjonijiet DML imħassra jew imħallat jekk ma jkollux a WHERE klawżola.
    L-aġġornament veloċi max/min wara tħassir jew DML imħallat m'għandux l-istess imġieba bħall-każ ta 'inserzjoni biss. Tħassar u tikkalkula mill-ġdid il-valuri max/min għall-gruppi affettwati. Trid tkun konxju tal-impatt tal-prestazzjoni tiegħu.
  • Fehmiet immaterjalizzati b'veduti jew subqueries msemmija fil- FROM klawsola tista 'tiġi aggornata malajr sakemm il-fehmiet jistgħu jingħaqdu kompletament. Għal informazzjoni dwar liema fehmiet se jingħaqdu, ara Referenza tal-Lingwa SQL Database Oracle.
  • Jekk ma jkunx hemm tingħaqad ta' barra, jista' jkollok selezzjonijiet arbitrarji u tingħaqad fil- WHERE klawżola.
  • Il-fehmiet aggregati mmaterjalizzati b'ġonot ta 'barra jistgħu jiġu iġġenerati malajr wara DML konvenzjonali u tagħbijiet diretti, sakemm it-tabella ta' barra biss tkun ġiet modifikata. Barra minn hekk, restrizzjonijiet uniċi għandhom jeżistu fuq il-kolonni ta' rabta tat-tabella ta' rabta ta' ġewwa. Jekk ikun hemm joins ta 'barra, il-joints kollha għandhom ikunu konnessi minn ANDs u għandu juża l-ugwaljanza (=) operatur.
  • Għal veduti mmaterjalizzati ma CUBE, ROLLUP, settijiet ta' raggruppament, jew konkatenazzjoni tagħhom, japplikaw ir-restrizzjonijiet li ġejjin:
    • il SELECT lista għandu jkun fiha raggruppament distintiv li jista 'jkun jew a GROUPING_ID funzjoni fuq kollox GROUP BY espressjonijiet jew GROUPING funzjonijiet wieħed għal kull wieħed GROUP BY espressjoni. Per eżempju, jekk il- GROUP BY klawsola tal-veduta mmaterjalizzata hija "GROUP BY CUBE(a, b)", imbagħad il- SELECT lista għandu jkun fiha jew "GROUPING_ID(a, b)» jew «GROUPING(a) AND GROUPING(b)» biex il-veduta mmaterjalizzata tkun fast refreshable.
    • GROUP BY m'għandux jirriżulta fi gruppi duplikati. Pereżempju, "GROUP BY a, ROLLUP(a, b)" ma tistax tiġi aġġornata malajr minħabba li tirriżulta fi gruppi duplikati "(a), (a, b), AND (a)".

5.3.8.7 Restrizzjonijiet fuq Aġġornament Mgħaġġel fuq Veduti Materjalizzati b'UNION ALL

Fehmiet materjalizzat mal- UNION ALL issettja l-appoġġ tal-operatur il REFRESH FAST għażla jekk il-kundizzjonijiet li ġejjin ikunu sodisfatti:

  • Il-mistoqsija li tiddefinixxi għandu jkollha l- UNION ALL operatur fl-ogħla livell.

    il UNION ALL operatur ma jistax jiġi inkorporat ġewwa subquery, b'eċċezzjoni waħda: The UNION ALL jista' jkun f'subquery fil- FROM klawsola sakemm il-mistoqsija li tiddefinixxi tkun tal-forma SELECT * FROM (ħarsa jew sottomistoqsija ma UNION ALL) bħal fl-eżempju li ġej:

    OĦLOQ ARA view_with_unionall AS (AGĦŻEL c.rowid crid, c.cust_id, 2 umarker MILL-klijenti c FEJN c.cust_last_name = 'Smith' UNION KOLLHA AGĦŻEL c.rowid crid, c.cust_id, 3 umarker MILL-klijenti c FEJN c.cust_last_name 'Jones'); OĦLOQ VISTA MATERJALIZZATA unionall_inside_view_mv REFRESH FAST FUQ TALBA KIF SELECT * FROM view_with_unionall;
    

    Innota li l-fehma view_with_unionall jissodisfa r-rekwiżiti għal aġġornament mgħaġġel.

  • Kull blokk tal-mistoqsija fil- UNION ALL mistoqsija trid tissodisfa r-rekwiżiti ta 'dehra mmaterjalizzata fast refreshable b'aggregati jew ħarsa fast refreshable materjalizzata b'joints.

    Ir-reġistri tal-vista mmaterjalizzati xierqa għandhom jinħolqu fuq it-tabelli kif meħtieġ għat-tip korrispondenti ta 'veduta mmaterjalizzata malajr refreshable.
    Innota li l-Oracle Database tippermetti wkoll il-każ speċjali ta 'tabella waħda mmaterjalizzat ħsieb ma' tingħaqad biss sakemm il- ROWID kolonna ġiet inkluża fil- SELECT lista u fil-log tal-vista mmaterjalizzat. Dan jidher fil-mistoqsija li tiddefinixxi l-vista view_with_unionall.

  • il SELECT lista ta' kull mistoqsija għandha tinkludi a UNION ALL markatur, u l- UNION ALL kolonna għandu jkollha valur numeriku jew string kostanti distint f'kull wieħed UNION ALL fergħa. Barra minn hekk, il-kolonna tal-markatur għandha tidher fl-istess pożizzjoni ordinali fil- SELECT lista ta' kull blokk ta' mistoqsijiet. Ara "UNION ALL Marker u Query Rewrite» għal aktar informazzjoni dwar UNION ALL markaturi.
  • Xi karatteristiċi bħal għoqdiet ta' barra, mistoqsijiet ta' veduta mmaterjalizzati aggregati b'inserzjoni biss u tabelli remoti mhumiex appoġġjati għal fehmiet immaterjalizzati b' UNION ALL. Innota, madankollu, li l-veduti mmaterjalizzati użati fir-replikazzjoni, li ma fihomx joins jew aggregates, jistgħu jiġu aggornati malajr meta UNION ALL jew tabelli remoti huma użati.
  • Il-parametru tal-inizjalizzazzjoni tal-kompatibilità għandu jiġi ssettjat għal 9.2.0 jew ogħla biex tinħoloq veduta mmaterjalizzata li tista 'tiġi aġġornata malajr b' UNION ALL.

Ma rridx noffendu lill-partitarji tal-Oracle, iżda meta wieħed jiġġudika mil-lista ta’ restrizzjonijiet tagħhom, jidher li dan il-mekkaniżmu nkiteb mhux fil-każ ġenerali, bl-użu ta’ xi tip ta’ mudell, iżda minn eluf ta’ Indjani, fejn kulħadd ingħata l-opportunità li jiktbu l-fergħa tagħhom, u kull wieħed minnhom għamel li seta’ u għamel. L-użu ta 'dan il-mekkaniżmu għal loġika reali huwa bħal mixi minn kamp tal-mini. Tista 'tikseb minjiera fi kwalunkwe ħin billi tolqot waħda mir-restrizzjonijiet mhux ovvji. Kif taħdem hija wkoll mistoqsija separata, iżda hija lil hinn mill-ambitu ta 'dan l-artikolu.

Microsoft SQL Server

Rekwiżiti addizzjonali

Minbarra l-għażliet SET u r-rekwiżiti tal-funzjoni deterministiċi, għandhom jiġu ssodisfati r-rekwiżiti li ġejjin:

  • L-utent li jesegwixxi CREATE INDEX għandu jkun is-sid tal-veduta.
  • Meta toħloq l-indiċi, il- IGNORE_DUP_KEY l-għażla għandha tkun issettjata għal OFF (is-setting default).
  • It-tabelli għandhom ikunu referenzjati b'ismijiet f'żewġ partijiet, iskema.isem tal-mejda fid-definizzjoni tal-veduta.
  • Funzjonijiet definiti mill-utent referenzjati fil-veduta għandhom jinħolqu bl-użu tal- WITH SCHEMABINDING għażla.
  • Kwalunkwe funzjoni definita mill-utent referenzjata fil-veduta għandha tkun referenzjata b'ismijiet f'żewġ partijiet, ..
  • Il-proprjetà ta' aċċess għad-dejta ta' funzjoni definita mill-utent għandha tkun NO SQL, u l-proprjetà ta 'aċċess estern għandha tkun NO.
  • Il-funzjonijiet tal-Common Language Runtime (CLR) jistgħu jidhru fil-lista tal-għażla tal-veduta, iżda ma jistgħux ikunu parti mid-definizzjoni taċ-ċavetta tal-indiċi raggruppat. Il-funzjonijiet CLR ma jistgħux jidhru fil-klawżola WHERE tal-vista jew il-klawżola ON ta 'operazzjoni JOIN fil-vista.
  • Il-funzjonijiet u l-metodi CLR tat-tipi definiti mill-utent CLR użati fid-definizzjoni tal-vista għandu jkollhom il-proprjetajiet stabbiliti kif muri fit-tabella li ġejja.

    proprjetà
    Nota

    DETERMINISTIKU = VERU
    Għandhom jiġu ddikjarati b'mod espliċitu bħala attribut tal-metodu Microsoft .NET Framework.

    PREĊIŻ = VERU
    Għandhom jiġu ddikjarati b'mod espliċitu bħala attribut tal-metodu .NET Framework.

    AĊĊESS TA' DEJTA = LE SQL
    Iddeterminat billi tissettja l-attribut DataAccess għal DataAccessKind.None u l-attribut SystemDataAccess għal SystemDataAccessKind.None.

    AĊĊESS ESTERN = LE
    Din il-proprjetà default għal NO għal rutini CLR.

  • Il-veduta trid tinħoloq billi tuża l- WITH SCHEMABINDING għażla.
  • Il-veduta trid tirreferi biss tabelli bażi li huma fl-istess database bħall-veduta. Il-fehma ma tistax tirreferi għal fehmiet oħra.
  • L-istqarrija SELECT fid-definizzjoni tal-vista m'għandux ikun fiha l-elementi Transact-SQL li ġejjin:

    COUNT
    Funzjonijiet ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, U OPENXML)
    OUTER jingħaqad (LEFT, RIGHT, Jew FULL)

    Tabella derivata (definita billi tispeċifika a SELECT dikjarazzjoni fil - FROM klawsola)
    Self-jingħaqad
    Tispeċifika kolonni bl-użu SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, Jew AVG
    Espressjoni ta' tabella komuni (CTE)

    float1, test, ntest, immaġni, XML, Jew filestream kolonni
    Subquery
    OVER klawsola, li tinkludi funzjonijiet ta' klassifikazzjoni jew ta' tieqa aggregata

    Predikati bit-test sħiħ (CONTAINS, FREETEXT)
    SUM funzjoni li tirreferi għal espressjoni nullable
    ORDER BY

    Funzjoni aggregata definita mill-utent CLR
    TOP
    CUBE, ROLLUP, Jew GROUPING SETS operaturi

    MIN, MAX
    UNION, EXCEPT, Jew INTERSECT operaturi
    TABLESAMPLE

    Varjabbli tat-tabella
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Settijiet ta' kolonni skarsi
    Funzjonijiet inline (TVF) jew multi-statement table-valued (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 Il-veduta indiċjata jista' jkun fiha float kolonni; madankollu, kolonni bħal dawn ma jistgħux jiġu inklużi fiċ-ċavetta tal-indiċi raggruppat.

  • If GROUP BY hija preżenti, id-definizzjoni VIEW għandu jkun fiha COUNT_BIG(*) u m'għandux ikun fih HAVING. Dawn GROUP BY ir-restrizzjonijiet huma applikabbli biss għad-definizzjoni tal-vista indiċjata. Mistoqsija tista' tuża veduta indiċjata fil-pjan ta' eżekuzzjoni tagħha anki jekk ma tissodisfax dawn GROUP BY restrizzjonijiet.
  • Jekk id-definizzjoni tal-veduta fiha a GROUP BY klawsola, iċ-ċavetta ta 'l-indiċi raggruppat uniku tista' tirreferi biss il-kolonni speċifikati fil- GROUP BY klawżola.

Huwa ċar hawnhekk li l-Indjani ma kinux involuti, peress li ddeċidew li jagħmluha skont l-iskema "se nagħmlu ftit, iżda tajjeb." Jiġifieri għandhom aktar minjieri fil-qasam, iżda l-post tagħhom huwa aktar trasparenti. L-iktar ħaġa diżappuntanti hija din il-limitazzjoni:

Il-veduta trid tirreferi biss tabelli bażi li huma fl-istess database bħall-veduta. Il-fehma ma tistax tirreferi għal fehmiet oħra.

Fit-terminoloġija tagħna, dan ifisser li funzjoni ma tistax taċċessa funzjoni oħra mmaterjalizzata. Dan inaqqas kull ideoloġija fil-bidu.
Ukoll, din il-limitazzjoni (u aktar fit-test) tnaqqas ħafna l-każijiet ta 'użu:

L-istqarrija SELECT fid-definizzjoni tal-vista m'għandux ikun fiha l-elementi Transact-SQL li ġejjin:

COUNT
Funzjonijiet ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, U OPENXML)
OUTER jingħaqad (LEFT, RIGHT, Jew FULL)

Tabella derivata (definita billi tispeċifika a SELECT dikjarazzjoni fil - FROM klawsola)
Self-jingħaqad
Tispeċifika kolonni bl-użu SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, Jew AVG
Espressjoni ta' tabella komuni (CTE)

float1, test, ntest, immaġni, XML, Jew filestream kolonni
Subquery
OVER klawsola, li tinkludi funzjonijiet ta' klassifikazzjoni jew ta' tieqa aggregata

Predikati bit-test sħiħ (CONTAINS, FREETEXT)
SUM funzjoni li tirreferi għal espressjoni nullable
ORDER BY

Funzjoni aggregata definita mill-utent CLR
TOP
CUBE, ROLLUP, Jew GROUPING SETS operaturi

MIN, MAX
UNION, EXCEPT, Jew INTERSECT operaturi
TABLESAMPLE

Varjabbli tat-tabella
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Settijiet ta' kolonni skarsi
Funzjonijiet inline (TVF) jew multi-statement table-valued (MSTVF)
OFFSET

CHECKSUM_AGG

OUTER JOINS, UNION, ORDER BY u oħrajn huma pprojbiti. Seta' kien aktar faċli li jiġi speċifikat x'seta' jintuża aktar milli dak li ma setax jintuża. Il-lista probabbilment tkun ħafna iqsar.

Fil-qosor: sett kbir ta 'restrizzjonijiet f'kull (ejja ninnota kummerċjali) DBMS vs xejn (bl-eċċezzjoni ta' wieħed loġiku, mhux tekniku) fit-teknoloġija LGPL. Madankollu, għandu jiġi nnutat li l-implimentazzjoni ta 'dan il-mekkaniżmu fil-loġika relazzjonali hija kemmxejn aktar diffiċli milli fil-loġika funzjonali deskritta.

Реализация

Kif taħdem? PostgreSQL jintuża bħala "magna virtwali". Hemm algoritmu kumpless ġewwa li jibni mistoqsijiet. Hawn sors. U m’hemmx biss sett kbir ta’ euristiċi b’mazz ta’ ifs. Allura, jekk għandek ftit xhur biex tistudja, tista 'tipprova tifhem l-arkitettura.

Jaħdem b'mod effettiv? Pjuttost effettiv. Sfortunatament, dan huwa diffiċli li jiġi ppruvat. Nista 'biss ngħid li jekk tqis l-eluf ta' mistoqsijiet li jeżistu f'applikazzjonijiet kbar, allura bħala medja huma aktar effiċjenti minn dawk ta 'żviluppatur tajjeb. Programmatur SQL eċċellenti jista 'jikteb kwalunkwe mistoqsija b'mod aktar effiċjenti, iżda b'elf mistoqsija huwa sempliċement mhux se jkollu l-motivazzjoni jew il-ħin biex jagħmel dan. L-unika ħaġa li issa nista 'nsemmi bħala prova ta' effettività hija li diversi proġetti qed jaħdmu fuq il-pjattaforma mibnija fuq dan id-DBMS Sistemi ERP, li għandhom eluf ta’ funzjonijiet MATERJALIZZATI differenti, b’eluf ta’ utenti u databases terabyte b’mijiet ta’ miljuni ta’ rekords li jaħdmu fuq server regolari b’żewġ proċessuri. Madankollu, kulħadd jista 'jiċċekkja/jiċħad l-effettività billi tniżżel pjattaforma u PostgreSQL, tixgħel illoggjar mistoqsijiet SQL u tipprova tibdel il-loġika u d-data hemmhekk.

Fl-artikoli li ġejjin, se nitkellem ukoll dwar kif tista 'tissettja restrizzjonijiet fuq il-funzjonijiet, taħdem b'sessjonijiet ta' bidla, u ħafna aktar.

Sors: www.habr.com

Żid kumment