Comhardaithe scríobhann agus léann i mbunachar sonraí

Comhardaithe scríobhann agus léann i mbunachar sonraí
San am atá caite Airteagal Rinne mé cur síos ar choincheap agus ar chur i bhfeidhm bunachar sonraí a tógadh ar bhonn feidhmeanna, seachas táblaí agus réimsí mar atá i mbunachair shonraí choibhneasta. Chuir sé go leor samplaí ar fáil a léirigh buntáistí an chur chuige seo thar an gceann clasaiceach. Mheas go leor nach raibh siad diongbháilte go leor.

San Airteagal seo, taispeánfaidh mé conas a ligeann an coincheap seo duit scríobh agus léann an bhunachar sonraí a chothromú go tapa agus go áisiúil gan aon athrú ar an loighic oibriúcháin. Rinneadh iarracht feidhmiúlacht chomhchosúil a chur i bhfeidhm i DBMSanna tráchtála nua-aimseartha (Oracle agus Microsoft SQL Server go háirithe). Ag deireadh an ailt taispeánfaidh mé nár oibrigh an méid a rinne siad, chun é a chur go éadrom, go han-mhaith.

Cur síos

Mar a bhí roimhe seo, chun tuiscint níos fearr a fháil tosóidh mé an cur síos le samplaí. Ligean le rá ní mór dúinn a chur i bhfeidhm loighic a chuirfidh ar ais liosta de na ranna le líon na bhfostaithe iontu agus a dtuarastal iomlán.

I mbunachar sonraí feidhme bheadh ​​cuma mar seo air:

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);

Beidh an chastacht a bhaineann leis an gceist seo a chur i gcrích in aon DBMS comhionann le O(líon fostaithe)toisc go n-éilíonn an ríomh seo tábla iomlán na bhfostaithe a scanadh agus ansin iad a ghrúpáil de réir roinne. Beidh roinnt forlíonadh beag (creidimid go bhfuil i bhfad níos mó fostaithe ná ranna) ag brath ar an bplean roghnaithe O(loguimhir fostaithe)O (líon ranna) le haghaidh grúpála agus mar sin de.

Is léir go bhféadfadh an forchostas forghníomhaithe a bheith difriúil i DBMSanna éagsúla, ach ní athróidh an chastacht ar bhealach ar bith.

Sa chur i bhfeidhm atá beartaithe, ginfidh an DBMS feidhme focheist amháin a ríomhfaidh na luachanna riachtanacha don roinn, agus ansin JOIN le tábla na roinne chun an t-ainm a fháil. Mar sin féin, do gach feidhm, nuair a dhéantar é a dhearbhú, is féidir marcóir ÁBHAR speisialta a shocrú. Cruthóidh an córas go huathoibríoch réimse comhfhreagrach do gach feidhm dá leithéid. Nuair a bheidh luach feidhm á athrú, athróidh luach an réimse san idirbheart céanna freisin. Nuair a bheidh rochtain ar an bhfeidhm seo, beidh rochtain ar an réimse réamh-ríomh.

Go háirithe, má shocraigh tú MATERIALIZED le haghaidh feidhmeanna countFostaithe и tuarastalSum, ansin cuirfear dhá réimse leis an tábla leis an liosta ranna, a stórálfar líon na bhfostaithe agus a dtuarastal iomlán. Aon uair a thagann athrú ar fhostaithe, ar a dtuarastail nó ar a gcleamhnachtaí ranna, athróidh an córas luachanna na réimsí seo go huathoibríoch. Gheobhaidh an cheist thuas rochtain dhíreach ar na réimsí seo agus déanfar é a fhorghníomhú i O (líon ranna).

Cad iad na srianta? Ach rud amháin: ní mór go mbeadh líon críochta luachanna ionchuir ag feidhm den sórt sin a bhfuil a luach sainithe ina leith. Seachas sin, beidh sé dodhéanta tábla a thógáil ina stórálfar a luachanna go léir, ós rud é nach féidir tábla a bheith ann le líon gan teorainn sraitheanna.

Sampla:

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

Sainmhínítear an fheidhm seo le haghaidh líon gan teorainn luachanna N (mar shampla, tá aon luach diúltach oiriúnach). Mar sin, ní féidir leat MATERIALIZED a chur air. Mar sin is teorannú loighciúil é seo, ní teorainn theicniúil (is é sin, ní toisc nach bhféadfaimis é a chur i bhfeidhm). Seachas sin, níl aon srianta ann. Is féidir leat grúpálacha, sórtáil, AND agus OR, PARTITION, recursion, etc. a úsáid.

Mar shampla, i bhfadhb 2.2 den alt roimhe seo, is féidir leat MATERIALIZED a chur ar an dá fheidhm:

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;

Cruthóidh an córas féin tábla amháin le heochracha cineáil Chustaiméirí, táirge и SLÁINTE, cuirfidh sé dhá réimse leis agus tabharfaidh sé cothrom le dáta na luachanna réimse iontu le haon athruithe. Nuair a dhéantar glaonna breise ar na feidhmeanna seo, ní dhéanfar iad a ríomh, ach ina áit sin léifear na luachanna ó na réimsí comhfhreagracha.

Ag baint úsáide as an meicníocht seo, is féidir leat, mar shampla, fáil réidh le recursions (CTE) i bhfiosruithe. Go háirithe, smaoinigh ar ghrúpaí a fhoirmíonn crann ag baint úsáide as an gcaidreamh idir an leanbh agus an tuismitheora (tá nasc ag gach grúpa lena tuismitheoir):

parent = DATA Group (Group);

I mbunachar sonraí feidhme, is féidir loighic atarlaithe a shonrú mar seo a leanas:

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;

Ós rud é don fheidhm is tuismitheoir marcáilte ÁBHAR, ansin cruthófar tábla le dhá eochair (grúpaí) dó, ina bhfuil an réimse is tuismitheoir beidh sé fíor ach amháin má tá an chéad eochair leanbh an dara. Beidh líon na n-iontrálacha sa tábla seo comhionann le líon na ngrúpaí arna iolrú faoi mheándoimhneacht an chrainn. Más gá duit, mar shampla, líon sliocht grúpa áirithe a chomhaireamh, is féidir leat an fheidhm seo a úsáid:

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

Ní bheidh aon CTE sa cheist SQL. Ina áit sin beidh GHRÚPA simplí AG.

Ag baint úsáide as an meicníocht seo, is féidir leat an bunachar sonraí a dhínormalú go héasca más gá:

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

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

Nuair a ghlaonn feidhm sonraí don líne ordaithe, léifear an réimse a bhfuil innéacs ina leith ón tábla le línte ordaithe. Nuair a athraíonn an dáta ordaithe, déanfaidh an córas féin an dáta dínormaithe sa líne a athríomh go huathoibríoch.

Buntáistí

Cad atá i gceist leis an meicníocht iomlán seo? I DBMSanna clasaiceacha, gan ceisteanna a athscríobh, ní féidir le forbróir nó DBA ach innéacsanna a athrú, staitisticí a chinneadh agus insint don phleanálaí fiosrúcháin conas iad a fhorghníomhú (agus níl fáil ar HINTanna ach i DBMSanna tráchtála). Is cuma cé chomh deacair a dhéanann siad iarracht, ní bheidh siad in ann an chéad cheist san alt i O (líon ranna) gan ceisteanna a athrú nó truicear a chur leis. Sa scéim mholta, ag an gcéim forbartha ní gá duit smaoineamh ar an struchtúr stórála sonraí agus ar na comhiomláin is cóir a úsáid. Is féidir seo go léir a athrú go héasca ar an eitilt, go díreach i bhfeidhm.

Go praiticiúil tá sé mar seo. Forbraíonn roinnt daoine loighic bunaithe go díreach ar an tasc atá ar láimh. Ní thuigeann siad algartaim agus a gcastacht, ná pleananna forghníomhaithe, ná cineálacha nascanna, ná aon chomhpháirt theicniúil eile. Is mó anailísithe gnó ná forbróirí iad na daoine seo. Ansin, téann sé seo go léir i dtástáil nó i bhfeidhm. Cumasaítear logáil fiosruithe fadtréimhseacha. Nuair a aimsítear ceist fhada, cinneann daoine eile (níos teicniúil - go bunúsach DBA) MATERIALIZED a chumasú ar roinnt feidhm idirmheánach. Moillíonn sé seo an taifeadadh beagán (toisc go dteastaíonn réimse breise san idirbheart a nuashonrú). Mar sin féin, ní hamháin go bhfuil an cheist seo níos tapúla go mór, ach freisin gach duine eile a úsáideann an fheidhm seo. Ag an am céanna, tá sé sách éasca cinneadh a dhéanamh ar an bhfeidhm atá le hábhar. Dhá phríomh-pharaiméadair: líon na luachanna ionchuir féideartha (is é seo cé mhéad taifead a bheidh sa tábla comhfhreagrach), agus cé chomh minic a úsáidtear é i bhfeidhmeanna eile.

Analogs

Tá meicníochtaí comhchosúla ag DBMSanna tráchtála nua-aimseartha: VIEW MATERIALIZED with FAST REFRESH (Oracle) agus INDEXED VIEW (Microsoft SQL Server). In PostgreSQL, ní féidir VIEW MATERIALIZED a nuashonrú in idirbheart, ach amháin ar iarratas (agus fiú le srianta an-dian), mar sin ní dhéanaimid é a mheas. Ach tá roinnt fadhbanna acu a chuireann teorainn shuntasach lena n-úsáid.

Ar an gcéad dul síos, ní féidir leat cur i bhfeidhm a chumasú ach amháin má tá VIEW rialta cruthaithe agat cheana féin. Seachas sin, beidh ort na hiarratais atá fágtha a athscríobh chun an t-amharc nuachruthaithe a rochtain chun an t-ábhar a úsáid. Nó fág gach rud mar atá sé, ach beidh sé neamhéifeachtach ar a laghad má tá sonraí áirithe réamhríofa ann cheana féin, ach ní úsáideann go leor fiosrúcháin i gcónaí é, ach é a athríomh.

Ar an dara dul síos, tá líon mór srianta acu:

Oracle

5.3.8.4 Srianta Ginearálta ar Athnuachan Mear

Is mar seo a leanas a chuirtear srian le ceist shainithe an amhairc ábhartha:

  • Níor cheart go mbeadh tagairtí do shloinneadh neamh-athdhéanta mar SYSDATE agus ROWNUM.
  • Níor cheart go mbeadh tagairtí don radharc ábhartha RAW or LONG RAW cineálacha sonraí.
  • Ní féidir leis a SELECT focheist liosta.
  • Ní féidir feidhmeanna anailíse a bheith ann (mar shampla, RANK) I SELECT clásal.
  • Ní féidir leis tagairt a dhéanamh do thábla ar a bhfuil an XMLIndex innéacs sainithe.
  • Ní féidir leis a MODEL clásal.
  • Ní féidir leis a HAVING clásal le subquery.
  • Ní féidir ceisteanna neadaithe a bhfuil ANY, ALL, Nó NOT EXISTS.
  • Ní féidir leis a [START WITH …] CONNECT BY clásal.
  • Ní féidir táblaí sonraí iolracha a bheith ann ag suíomhanna éagsúla.
  • ON COMMIT ní féidir táblaí cianda mionsonraí a bheith ag radharcanna réadaithe.
  • Ní mór nasc nó comhiomlán a bheith ag radhairc neadaithe réadaithe.
  • Radhairc cheangail ábharaithe agus radhairc chomhiomlána ábhartha le a GROUP BY ní féidir clásal a roghnú as tábla treoir-eagraithe.

5.3.8.5 Srianta ar Athnuachan Mear ar Radhairc Ábhartha le Seangán Amháin

Níl na srianta seo a leanas ag baint le hathnuachan tapa le fiosrúcháin a shainiú le haghaidh radhairc ábhartha le ceangail amháin agus níl na srianta seo a leanas ag aon chomhiomlán:

  • Gach srian ó «Srianta Ginearálta ar Athnuachan Mear".
  • Ní féidir leo a bheith GROUP BY clásail nó comhiomláin.
  • Rowids de na táblaí ar fad sa FROM Ní mór liosta le feiceáil sa SELECT liosta den cheist.
  • Ní mór logaí radhairc ábharaithe a bheith ann le róideanna do na táblaí bonn ar fad sa FROM liosta den cheist.
  • Ní féidir leat radharc réadaithe tapa inathnuaite a chruthú ó tháblaí iolracha le naisc shimplí a chuimsíonn colún den chineál oibiachta sa SELECT ráiteas.

Chomh maith leis sin, ní bheidh an modh athnuachana a roghnaíonn tú ró-éifeachtach más rud é:

  • Úsáideann an cheist shainiúcháin ceangal seachtrach a iompraíonn mar cheangal inmheánach. Má tá ceangal den sórt sin sa cheist shainithe, smaoinigh ar an gceist shainithe a athscríobh chun ceangal inmheánach a bheith ann.
  • An SELECT tá nathanna ar cholúin ó tháblaí iolracha i liosta den amharc ábhartha.

5.3.8.6 Srianta ar Athnuachan Mear ar Radhairc Ábhartha le Comhiomláin

Tá na srianta seo a leanas maidir le hathnuachan tapa ag baint le fiosrúcháin a shainiú le haghaidh radhairc ábhartha le comhiomláin nó le naisc:

Tacaítear le hathnuachan tapa don dá cheann ON COMMIT agus ON DEMAND radhairc ábhartha, ach tá na srianta seo a leanas i bhfeidhm:

  • Ní mór logaí radhairc ábhartha a bheith ag gach tábla sa radharc ábhartha, agus caithfidh na logaí radhairc ábhartha:
    • Cuimsigh na colúin go léir ón tábla dá dtagraítear sa radharc iarbhír.
    • Sonraigh le ROWID agus INCLUDING NEW VALUES.
    • sonraigh an SEQUENCE clásal má táthar ag súil go mbeidh meascán d'ionsáigh/ualaí díreacha, scriosta agus nuashonruithe sa tábla.

  • Amháin SUM, COUNT, AVG, STDDEV, VARIANCE, MIN agus MAX Tugtar tacaíocht do athnuachan tapa.
  • COUNT(*) Ní mór a shonrú.
  • Ní mór feidhmeanna comhiomlána tarlú ach amháin mar an chuid is forimeallaí den slonn. Is é sin, comhiomláin mar AVG(AVG(x)) or AVG(x)+ AVG(x) ní cheadaítear.
  • I gcás gach comhiomlán, mar shampla AVG(expr), an comhfhreagrach COUNT(expr) Ní mór a bheith i láthair. Molann Oracle é sin SUM(expr) a shonrú.
  • If VARIANCE(expr) or STDDEV(expr) sonraithe, COUNT(expr) agus SUM(expr) Ní mór a shonrú. Molann Oracle é sin SUM(expr *expr) a shonrú.
  • An SELECT ní féidir leis an gcolún sa cheist shainithe a bheith ina shloinneadh casta le colúin ó táblaí iolracha. Réiteach féideartha ina leith seo is ea radharc réadaithe neadaithe a úsáid.
  • An SELECT Ní mór liosta go léir a bheith ann GROUP BY colúin.
  • Níl an radharc ábhartha bunaithe ar thábla iargúlta amháin nó níos mó.
  • Má úsáideann tú a CHAR cineál sonraí sna colúin scagaire de loga radhairc ábhartha, ní mór go mbeadh tacair charachtar an mháistirshuímh agus an dearcadh ábhartha mar an gcéanna.
  • Má tá ceann amháin díobh seo a leanas ag an radharc iarbhír, ní thacaítear le hathnuachan tapa ach amháin ar ghnáthiontáin DML agus ar ualaí díreacha.
    • Radhairc ábharaithe le MIN or MAX comhiomláin
    • Radhairc ábharaithe a bhfuil SUM(expr) ach níl COUNT(expr)
    • Radhairc ábharaithe gan COUNT(*)

    Radharc ábhartha ionsáite amháin a thugtar ar radharc ábhartha den sórt sin.

  • Radharc ábhartha le MAX or MIN is féidir é a athnuachan go tapa tar éis ráitis DML a scriosadh nó a mheascadh mura bhfuil a WHERE clásal.
    Níl an t-iompar céanna ag an uas-athnuachan tapa tar éis scriosta nó DML measctha agus atá sa chás ionsáite amháin. Scriosann sé agus athríomh na luachanna uasta/min do na grúpaí lena mbaineann. Ní mór duit a bheith feasach ar a thionchar feidhmíochta.
  • Radhairc ábharaithe le radhairc nó focheisteanna ainmnithe sa FROM is féidir clásal a athnuachan go tapa ar choinníoll gur féidir na tuairimí a chumasc go hiomlán. Chun faisnéis a fháil faoi na tuairimí a chumasc, féach Bunachar Sonraí Oracle Tagairt Teanga SQL.
  • Mura bhfuil aon naisc sheachtracha ann, d'fhéadfadh go mbeadh roghanna treallacha agat agus go nglacfaidh tú páirt sa WHERE clásal.
  • Is féidir radharcanna comhiomlána ábharaithe le ceangail sheachtracha a athnuachan go tapa tar éis gnáth-DML agus ualaí díreacha, ar choinníoll nach bhfuil ach an tábla seachtrach modhnaithe. Chomh maith leis sin, ní mór go mbeadh srianta uathúla ar na colúin ceangail den tábla ceangail istigh. Má tá naisc sheachtracha ann, ní mór na naisc go léir a nascadh le chéile ANDs agus caithfidh sé an comhionannas a úsáid (=) oibreora.
  • Le haghaidh tuairimí ábhartha le CUBE, ROLLUP, tacair ghrúpála, nó comhtháthú díobh, tá feidhm ag na srianta seo a leanas:
    • An SELECT Ba chóir go mbeadh grúpáil idirdhealaithe ar an liosta ar féidir leis a bheith ina GROUPING_ID feidhm ar gach GROUP BY nathanna cainte nó GROUPING feidhmeanna ceann do gach GROUP BY léiriú. Mar shampla, má tá an GROUP BY is é clásal den radharc ábhartha ná "GROUP BY CUBE(a, b)", ansin an SELECT ba cheart go mbeadh ceachtar den liosta "GROUPING_ID(a, b)»Nó«GROUPING(a) AND GROUPING(b)» le go mbeidh an radharc in-athnuaite tapa.
    • GROUP BY níor cheart go mbeadh aon ghrúpálacha dúblacha mar thoradh orthu. Mar shampla, "GROUP BY a, ROLLUP(a, b)" ní féidir é a athnuachan go tapa toisc go mbíonn grúpálacha dúblacha mar thoradh air "(a), (a, b), AND (a)".

5.3.8.7 Srianta ar Athnuachan Mear ar Radhairc Ábhartha le AONTAIS UILE

Radhairc ábharaithe leis an UNION ALL tacaíocht oibreoir socraithe an REFRESH FAST rogha má shásaítear na coinníollacha seo a leanas:

  • Caithfidh an cheist sainmhínithe a bheith ag an UNION ALL oibreoir ag an leibhéal is airde.

    An UNION ALL ní féidir oibreoir a neadú laistigh d'fhocheist, ach amháin eisceacht: An UNION ALL is féidir a bheith i subquery sa FROM clásal ar choinníoll go bhfuil an cheist shainitheach den fhoirm SELECT * FROM (amharc nó focheist le UNION ALL) mar atá sa sampla seo a leanas:

    CREATE VIEW view_with_unionall AS (SELECT c.rowid crid, c.cust_id, 2 umarker FROM custaiméirí c WHERE c.cust_last_name = 'Smith' AONTAIS GACH SELECT c.rowid crid, c.cust_id, 3 umarker Ó chustaiméirí c ÁIT c.cust_last_name = ‘Jones’); CREATE MATERIALIZED VIEW unionall_inside_view_mv ATHNUACHAN FAST AR ÉILEAMH MAR ROGHNÚ *FROM view_with_unionall;
    

    Tabhair faoi deara go bhfuil an dearcadh view_with_unionall shásaíonn sé na ceanglais maidir le hathnuachan tapa.

  • Gach bloc ceiste sa UNION ALL ní mór don cheist na ceanglais maidir le hamharc ábhartha in-athnuachan tapa le comhiomláin a shásamh nó le hamharc ábhartha in-athnuachan tapa le ceangail.

    Ní mór na logaí radhairc ábhartha iomchuí a chruthú ar na táblaí de réir mar is gá don chineál amhairc ábhartha tapa in-athnuaite.
    Tabhair faoi deara go gceadaíonn Bunachar Sonraí Oracle freisin cás speisialta d’amharc éiritheach tábla amháin le nascanna ar fáil ach an ROWID colún curtha san áireamh sa SELECT liosta agus sa loga radhairc ábhartha. Taispeántar é seo sa cheist shainithe den radharc view_with_unionall.

  • An SELECT ní mór liosta de gach fiosrúchán a UNION ALL marcóir, agus an UNION ALL caithfidh luach tairiseach uimhriúil nó téadluach ar leith a bheith i ngach colún UNION ALL géaga. Ina theannta sin, caithfidh an colún marcóra a bheith sa suíomh ordúil céanna sa SELECT liosta de gach bloc ceiste. Féach "AONTAIS UILE Marcóir agus Iarratas Athscríobh» le haghaidh tuilleadh eolais maidir le UNION ALL marcóirí.
  • Ní thacaítear le roinnt gnéithe ar nós nascanna seachtracha, cuir isteach ach fiosrúcháin maidir le hamharc réadaithe comhiomlán agus ciantáblaí le haghaidh radhairc ábhartha le UNION ALL. Tabhair faoi deara, áfach, gur féidir radhairc fhíoraithe a úsáidtear i macasamhlú, nach bhfuil naisc ná comhiomláin iontu, a athnuachan go tapa nuair a UNION ALL nó úsáidtear táblaí iargúlta.
  • Ní mór an paraiméadar tosaithe comhoiriúnachta a shocrú go 9.2.0 nó níos airde chun radharc ábhartha in-athnuaite tapa a chruthú le UNION ALL.

Níl mé ag iarraidh lucht leanúna Oracle a chiontú, ach ag breith ar a liosta srianta, is cosúil nach raibh an mheicníocht seo scríofa sa chás ginearálta, ag baint úsáide as samhail de chineál éigin, ach ag na mílte Indians, áit ar tugadh an deis do gach duine. scriobh a chraobh féin, agus rinne gach duine aca gach a bhféadfadh sé, agus rinne. Tá baint úsáide as an meicníocht seo le haghaidh loighic fíor cosúil le siúl trí mianach. Is féidir leat mianach a fháil ag am ar bith trí cheann de na srianta neamh-soiléir a bhualadh. Ceist ar leith is ea an chaoi a n-oibríonn sé freisin, ach tá sé lasmuigh de raon feidhme an ailt seo.

Freastalaí Microsoft SQL

Riachtanais Bhreise

Chomh maith leis na roghanna SET agus ceanglais feidhme cinntitheach, ní mór na ceanglais seo a leanas a chomhlíonadh:

  • An t-úsáideoir a fhorghníomhú CREATE INDEX ní mór é a bheith ina úinéir ar an radharc.
  • Nuair a chruthaíonn tú an t-innéacs, beidh an IGNORE_DUP_KEY ní mór an rogha a shocrú go AS (an socrú réamhshocraithe).
  • Ní mór tagairt a dhéanamh do tháblaí le hainmneacha dhá pháirt, scéimre.ainm boird sa sainmhíniú dearcadh.
  • Ní mór feidhmeanna a shainítear leis an úsáideoir dá dtagraítear san amharc a chruthú trí úsáid a bhaint as an WITH SCHEMABINDING rogha.
  • Ní mór ainmneacha dhá pháirt a thagairt d’fheidhmeanna ar bith atá sainithe ag an úsáideoir dá dtagraítear san amharc, ..
  • Ní mór an t-airí rochtana sonraí atá ag feidhm atá sainithe ag an úsáideoir NO SQL, agus ní mór maoin rochtana seachtracha NO.
  • Is féidir le feidhmeanna coitianta ama rite teanga (CLR) a bheith i liosta roghnaithe an amhairc, ach ní féidir leo a bheith mar chuid den sainmhíniú ar an eochair innéacs cnuasaithe. Ní féidir feidhmeanna CLR a bheith sa chlásal WHERE den radharc nó sa chlásal ON d'oibríocht JOIN san amharc.
  • Ní mór go mbeadh na hairíonna socraithe mar a thaispeántar sa tábla seo a leanas ag feidhmeanna agus modhanna CLR cineálacha atá sainithe ag úsáideoirí CLR a úsáidtear sa sainmhíniú radhairc.

    Maoin
    nótaí

    DETERMINISTIC = TRUE
    Ní mór é a dhearbhú go sainráite mar tréith de chuid modh Creat .NET Microsoft.

    BEARTA = TRUE
    Ní mór é a dhearbhú go sainráite mar tréith den mhodh Creat .NET.

    ROCHTAIN SONRAÍ = NÍL SQL
    Arna chinneadh ag socrú aitreabúid DataAccess chuig DataAccessKind.None agus tréith SystemDataAccess chuig SystemDataAccessKind.None.

    ROCHTAIN SEACHTRACH = UIMH
    Tá an mhaoin seo réamhshocraithe go NÍL do ghnáthaimh CLR.

  • Ní mór an radharc a chruthú trí úsáid a bhaint as an WITH SCHEMABINDING rogha.
  • Ní mór don amharc tagairt a dhéanamh ach do bhuntáblaí atá sa bhunachar sonraí céanna leis an amharc. Ní féidir leis an radharc tagairt a dhéanamh do thuairimí eile.
  • Níor cheart go mbeadh na heilimintí Transact-SQL seo a leanas sa ráiteas SELECT sa sainmhíniú radhairc:

    COUNT
    feidhmeanna ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, AGUS OPENXML)
    OUTER cheanglaíonn (LEFT, RIGHT, Nó FULL)

    Tábla díorthaithe (arna shainiú ag sonrú a SELECT ráiteas sa FROM clásal)
    Féin-cheangail
    Colúin a shonrú trí úsáid a bhaint as SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, Nó AVG
    Slonn tábla coitianta (CTE)

    snámh1, téacs, téacs, íomha, XML, Nó sruth comhaid colúin
    Subquery
    OVER clásal, lena n-áirítear feidhmeanna rangú nó comhiomlán fuinneoige

    Réamhfhocail lántéacs (CONTAINS, FREETEXT)
    SUM feidhm a thagraíonn do slonn do-null
    ORDER BY

    Feidhm chomhiomlán atá sainithe ag an úsáideoir CLR
    TOP
    CUBE, ROLLUP, Nó GROUPING SETS Oibreoirí

    MIN, MAX
    UNION, EXCEPT, Nó INTERSECT Oibreoirí
    TABLESAMPLE

    Athróga tábla
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Leagann colún tanaí
    Feidhmeanna inlíne (TVF) nó feidhmeanna ilráitis luacháilte (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 Is féidir leis an radharc innéacsaithe a bheith ann snámh colúin; ní féidir colúin den sórt sin a áireamh san eochair innéacs cnuasaithe, áfach.

  • If GROUP BY faoi ​​láthair, ní mór go mbeadh an sainmhíniú VIEW COUNT_BIG(*) agus ní mór nach bhfuil HAVING. na GROUP BY níl feidhm ag srianta ach leis an sainmhíniú ar an radharc innéacsaithe. Is féidir le ceist amharc innéacsaithe a úsáid ina phlean forghníomhaithe fiú mura sásaíonn sé iad sin GROUP BY srianta.
  • Má tá a GROUP BY clásal, ní féidir le eochair an innéacs cnuasaithe uathúil ach tagairt a dhéanamh do na colúin atá sonraithe sa GROUP BY clásal.

Tá sé soiléir anseo nach raibh baint ag na hIndiaigh, toisc gur shocraigh siad é a dhéanamh de réir na scéime "is beag a dhéanfaimid, ach is maith." Is é sin, tá níos mó mianaigh acu ar an bpáirc, ach tá a suíomh níos trédhearcaí. Is é an rud is mó díomá ná an teorannú seo:

Ní mór don amharc tagairt a dhéanamh ach do bhuntáblaí atá sa bhunachar sonraí céanna leis an amharc. Ní féidir leis an radharc tagairt a dhéanamh do thuairimí eile.

Inár dtéarmaíocht, ciallaíonn sé seo nach féidir le feidhm rochtain a fháil ar fheidhm ábhartha eile. Laghdaíonn sé seo gach idé-eolaíocht sa bachlóg.
Chomh maith leis sin, laghdaíonn an teorannú seo (agus níos faide sa téacs) go mór na cásanna úsáide:

Níor cheart go mbeadh na heilimintí Transact-SQL seo a leanas sa ráiteas SELECT sa sainmhíniú radhairc:

COUNT
feidhmeanna ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, AGUS OPENXML)
OUTER cheanglaíonn (LEFT, RIGHT, Nó FULL)

Tábla díorthaithe (arna shainiú ag sonrú a SELECT ráiteas sa FROM clásal)
Féin-cheangail
Colúin a shonrú trí úsáid a bhaint as SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, Nó AVG
Slonn tábla coitianta (CTE)

snámh1, téacs, téacs, íomha, XML, Nó sruth comhaid colúin
Subquery
OVER clásal, lena n-áirítear feidhmeanna rangú nó comhiomlán fuinneoige

Réamhfhocail lántéacs (CONTAINS, FREETEXT)
SUM feidhm a thagraíonn do slonn do-null
ORDER BY

Feidhm chomhiomlán atá sainithe ag an úsáideoir CLR
TOP
CUBE, ROLLUP, Nó GROUPING SETS Oibreoirí

MIN, MAX
UNION, EXCEPT, Nó INTERSECT Oibreoirí
TABLESAMPLE

Athróga tábla
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Leagann colún tanaí
Feidhmeanna inlíne (TVF) nó feidhmeanna ilráitis luacháilte (MSTVF)
OFFSET

CHECKSUM_AGG

Tá cosc ​​ar aontuithe seachtracha, AONTAIS, ORDÚ GAN agus daoine eile. B’fhéidir gurbh fhusa a shonrú cad a d’fhéadfaí a úsáid seachas cad nach bhféadfaí a úsáid. Is dócha go mbeadh an liosta i bhfad níos giorra.

Mar achoimre: sraith ollmhór srianta i ngach (tabhair faoi deara tráchtála) DBMS vs none (cé is moite de cheann amháin loighciúil, ní teicniúil) i dteicneolaíocht LGPL. Mar sin féin, ba chóir a thabhairt faoi deara go bhfuil sé beagán níos deacra an mheicníocht seo a chur i bhfeidhm sa loighic choibhneasta ná mar atá sa loighic feidhme a thuairiscítear.

Cur i bhFeidhm

Conas a oibríonn sé? Úsáidtear PostgreSQL mar “mheaisín fíorúil”. Tá algartam casta taobh istigh a thógann ceisteanna. Anseo foinse. Agus ní hamháin go bhfuil sraith mhór heuristics ann le bunch of ifs. Mar sin, má tá cúpla mí agat chun staidéar a dhéanamh, is féidir leat iarracht a dhéanamh ailtireacht a thuiscint.

An oibríonn sé go héifeachtach? Éifeachtach go leor. Ar an drochuair, tá sé seo deacair a chruthú. Ní féidir liom a rá ach má mheasann tú na mílte fiosrúchán atá ann in iarratais mhóra, ansin ar an meán tá siad níos éifeachtaí ná iad siúd a bhaineann le forbróir maith. Is féidir le ríomhchláraitheoir SQL den scoth aon cheist a scríobh ar bhealach níos éifeachtaí, ach le míle ceist ní bheidh an spreagadh ná an t-am aige é a dhéanamh. Is é an t-aon rud is féidir liom a lua anois mar chruthúnas ar éifeachtacht ná go bhfuil roinnt tionscadal ag obair ar an ardán a tógadh ar an DBMS seo Córais ERP, a bhfuil na mílte feidhmeanna MATERIALIZED éagsúla acu, leis na mílte úsáideoirí agus bunachair shonraí terabyte leis na céadta milliún taifead ag rith ar fhreastalaí rialta dhá phróiseálaí. Mar sin féin, is féidir le duine ar bith an éifeachtacht a sheiceáil / a bhréagnú trí íoslódáil a dhéanamh ardán agus PostgreSQL, ar siúl ag logáil ceisteanna SQL agus ag iarraidh an loighic agus na sonraí a athrú ann.

Sna hailt seo a leanas, labhróidh mé freisin faoi conas is féidir leat srianta a leagan síos ar fheidhmeanna, oibriú le seisiúin athraithe, agus i bhfad níos mó.

Foinse: will.com

Add a comment