Bidh cothromachadh a’ sgrìobhadh agus a’ leughadh ann an stòr-dàta

Bidh cothromachadh a’ sgrìobhadh agus a’ leughadh ann an stòr-dàta
Anns an roimhe artaigil Thug mi cunntas air bun-bheachd agus buileachadh stòr-dàta a chaidh a thogail air bunait gnìomhan, seach clàran agus raointean mar ann an stòran-dàta co-cheangailte. Thug e seachad mòran eisimpleirean a 'sealltainn buannachdan an dòigh-obrach seo thairis air an fhear clasaigeach. Bha mòran den bheachd nach robh iad cinnteach gu leòr.

Anns an aiste seo, bidh mi a 'sealltainn mar a' bhun-bheachd seo a 'leigeil leat gu luath agus gu h-iomchaidh cothromachadh a sgrìobhadh agus a' leughadh chun an stòr-dàta gun atharrachadh sam bith ann an loidsig obrachaidh. Thathas air feuchainn ri gnìomhachd coltach ris a chuir an gnìomh ann an DBMS malairteach an latha an-diugh (gu sònraichte, Oracle agus Microsoft SQL Server). Aig deireadh an artaigil seallaidh mi nach do dh’ obraich na rinn iad, gus a chuir gu socair, a-mach glè mhath.

Tuairisgeul

Mar a bha roimhe, airson tuigse nas fheàrr tòisichidh mi an tuairisgeul le eisimpleirean. Canaidh sinn gum feum sinn loidsig a chuir an gnìomh a thilleas liosta de roinnean leis an àireamh de luchd-obrach annta agus an tuarastal iomlan.

Ann an stòr-dàta gnìomh bhiodh e a’ coimhead mar seo:

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

Bidh cho iom-fhillteachd a bhithear a’ cur a’ cheist seo an gnìomh ann an DBMS sam bith co-ionann ri O (àireamh luchd-obrach)oir feumaidh an àireamhachadh seo an clàr iomlan de luchd-obrach a sganadh agus an uairsin gan cruinneachadh a rèir roinn. Bidh beagan a bharrachd ann cuideachd (tha sinn a’ creidsinn gu bheil tòrr a bharrachd luchd-obrach ann na roinnean) a rèir a’ phlana a chaidh a thaghadh O (àireamh luchd-obrach) no O (àireamh roinnean) airson buidhnean agus mar sin air adhart.

Tha e soilleir gum faodadh an àrdachadh gu bàs a bhith eadar-dhealaichte ann an diofar DBMSn, ach chan atharraich an iom-fhillteachd ann an dòigh sam bith.

Anns a’ bhuileachadh a thathar a’ moladh, cruthaichidh an DBMS gnìomh aon fho-iarrtas a nì àireamhachadh air na luachan a tha a dhìth airson na roinne, agus an uairsin nì iad JOIN le clàr na roinne gus an t-ainm fhaighinn. Ach, airson gach gnìomh, nuair a thathar ag ainmeachadh, tha e comasach comharra sònraichte MATERIALIZED a shuidheachadh. Cruthaichidh an siostam gu fèin-ghluasadach raon co-fhreagarrach airson gach gnìomh mar sin. Nuair a dh’ atharraicheas luach gnìomh, atharraichidh luach an raoin san aon ghnothach cuideachd. Nuair a gheibh thu cothrom air a’ ghnìomh seo, gheibhear cothrom air an raon ro-àireamhaichte.

Gu sònraichte, ma shuidhicheas tu MATERIALIZED airson gnìomhan cunntadh Luchd-obrach и tuarastalSum, an uairsin thèid dà raon a chur ris a 'chlàr leis an liosta de roinnean, a bhios a' stòradh an àireamh de luchd-obrach agus an tuarastal iomlan. Aon uair ‘s gu bheil atharrachadh ann an luchd-obrach, an tuarastalan no an ceanglaichean roinne, atharraichidh an siostam luachan nan raointean sin gu fèin-ghluasadach. Gheibh a’ cheist gu h-àrd cothrom air na raointean sin gu dìreach agus thèid a chuir gu bàs ann O (àireamh roinnean).

Dè na cuingeachaidhean a th’ ann? Dìreach aon rud: feumaidh àireamh chrìochnaichte de luachan cuir a-steach a bhith aig gnìomh mar seo airson a bheil a luach air a mhìneachadh. Rud eile, bidh e do-dhèanta clàr a thogail a bhios a ’stòradh a luachan gu lèir, leis nach urrainn clàr a bhith ann le àireamh neo-chrìochnach de shreathan.

Eisimpleir:

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

Tha an gnìomh seo air a mhìneachadh airson àireamh neo-chrìochnach de luachan N (mar eisimpleir, tha luach àicheil sam bith freagarrach). Mar sin, chan urrainn dhut MATERIALIZED a chuir air. Mar sin is e cuingealachadh loidsigeach a tha seo, chan e tè theicnigeach (is e sin, chan ann air sgàth nach b’ urrainn dhuinn a chuir an gnìomh). Rud eile, chan eil cuingealachaidhean ann. Faodaidh tu buidhnean a chleachdadh, òrdachadh, AGUS agus OR, PÀIRT, ath-chuairteachadh, msaa.

Mar eisimpleir, ann an duilgheadas 2.2 den artaigil roimhe, faodaidh tu MATERIALIZED a chuir air an dà ghnìomh:

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;

Cruthaichidh an siostam fhèin aon bhòrd le iuchraichean seòrsa Luchd-cleachdaidh, bathar и INTEGER, cuiridh e dà raon ris agus bheir e ùrachadh air na luachan raoin annta le atharrachaidhean sam bith. Nuair a thèid tuilleadh ghairmean gu na gnìomhan sin a dhèanamh, cha tèid an cunntadh, ach thèid na luachan a leughadh bho na raointean co-fhreagarrach.

A 'cleachdadh an uidheamachd seo, faodaidh tu, mar eisimpleir, faighinn cuidhteas ath-chuairtean (CTE) ann an ceistean. Gu sònraichte, smaoinich air buidhnean a bhios a’ cruthachadh craobh a’ cleachdadh an dàimh eadar pàiste/pàrant (tha ceangal aig gach buidheann ri a pàrant):

parent = DATA Group (Group);

Ann an stòr-dàta gnìomh, faodar loidsig ath-chuairteachaidh a shònrachadh mar 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;

Air sgàth airson an gnìomh is Pàrant air a chomharrachadh MATERIALIZED, an uairsin thèid clàr le dà iuchair (buidhnean) a chruthachadh air a shon, anns a bheil an raon is Pàrant bidh e fìor a-mhàin ma tha a 'chiad iuchair na leanabh den dàrna fear. Bidh an àireamh de chuir a-steach sa chlàr seo co-ionann ris an àireamh de bhuidhnean air an iomadachadh le doimhneachd cuibheasach na craoibhe. Ma dh'fheumas tu, mar eisimpleir, an àireamh de shliochd ann am buidheann sònraichte a chunntadh, faodaidh tu an gnìomh seo a chleachdadh:

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

Cha bhi CTE ann an ceist SQL. An àite sin bidh GRÙPA sìmplidh ann.

A’ cleachdadh an uidheamachd seo, is urrainn dhut an stòr-dàta a dhì-normalachadh gu furasta ma tha sin riatanach:

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

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

Nuair a ghairm gnìomh ceann-latha airson an loidhne òrduigh, thèid an raon air a bheil clàr-amais a leughadh bhon chlàr le loidhnichean òrduigh. Nuair a dh’ atharraicheas ceann-latha an òrduigh, nì an siostam fhèin ath-àireamhachadh gu fèin-ghluasadach air a’ cheann-latha denormalized san loidhne.

buannachdan

Carson a tha an uidheamachd seo gu lèir? Ann an DBMS clasaigeach, gun ath-sgrìobhadh cheistean, chan urrainn do leasaiche no DBA ach clàran-amais atharrachadh, staitistig a dhearbhadh agus innse don neach-dealbhaidh ceist mar a chuireas iad an gnìomh iad (agus chan eil HINTn rim faighinn ach ann an DBMS malairteach). Ge bith dè cho cruaidh ‘s a dh’ fheuchas iad, cha bhith e comasach dhaibh a’ chiad cheist san artaigil a lìonadh a-steach O (àireamh de roinnean) gun a bhith ag atharrachadh cheistean no a’ cur luchd-brosnachaidh ris. Anns an sgeama a thathar a’ moladh, aig an ìre leasachaidh chan fheum thu smaoineachadh air structar stòradh dàta agus dè na cruinneachaidhean a chleachdas tu. Faodar seo uile atharrachadh gu furasta air an itealan, gu dìreach ann an gnìomh.

Ann an cleachdadh tha e coltach ri seo. Bidh cuid de dhaoine a 'leasachadh loidsig gu dìreach stèidhichte air an obair a tha ri làimh. Chan eil iad a’ tuigsinn algoirmean agus an iom-fhillteachd, no planaichean cur an gnìomh, no seòrsaichean ceangail, no pàirt theicnigeach sam bith eile. Tha na daoine sin nan luchd-anailis gnìomhachais nas motha na luchd-leasachaidh. An uairsin, bidh seo uile a’ dol gu deuchainn no obrachadh. A’ comasachadh fiosan fad-ùine a chlàradh. Nuair a lorgar ceist fhada, an uairsin bidh daoine eile (nas teignigeach - gu dearbh DBA) a’ co-dhùnadh leigeil le MATERIALIZED air cuid de dh’ obair eadar-mheadhanach. Bidh seo a’ slaodadh sìos a’ chlàradh beagan (leis gu bheil feum air raon a bharrachd sa ghnothach ùrachadh). Ach, chan e a-mhàin gu bheil a’ cheist seo air a luathachadh gu mòr, ach cuideachd a h-uile duine eile a chleachdas an gnìomh seo. Aig an aon àm, tha e gu math sìmplidh co-dhùnadh dè an gnìomh a thèid a thoirt gu buil. Dà phrìomh pharamadair: an àireamh de luachan a-steach a dh'fhaodadh a bhith ann (is e seo an àireamh de chlàran a bhios anns a 'chlàr co-fhreagarrach), agus dè cho tric' sa bhios e air a chleachdadh ann an gnìomhan eile.

Anail

Tha dòighean co-chosmhail aig DBMSan malairteach an latha an-diugh: VIEW MATERIALIZED le FAST REFRESH (Oracle) agus INDEXED VIEW (Microsoft SQL Server). Ann am PostgreSQL, chan urrainnear VIEW MATERIALIZED ùrachadh ann an malairt, ach dìreach le iarrtas (agus eadhon le cuingealachaidhean gu math teann), agus mar sin chan eil sinn ga mheas. Ach tha grunn dhuilgheadasan aca a tha gu mòr a 'cuingealachadh an cleachdadh.

An toiseach, chan urrainn dhut stuth a chomasachadh ach ma tha thu air VIEW cunbhalach a chruthachadh mu thràth. Rud eile, feumaidh tu na h-iarrtasan a tha air fhàgail ath-sgrìobhadh gus faighinn chun t-sealladh a chaidh a chruthachadh às ùr gus an stuth seo a chleachdadh. No fàg a h-uile càil mar a tha e, ach bidh e co-dhiù neo-èifeachdach ma tha dàta ro-àireamhaichte ann mar-thà, ach chan eil mòran cheistean an-còmhnaidh ga chleachdadh, ach ga ath-àireamhachadh.

San dàrna h-àite, tha àireamh mhòr de chuingealachaidhean aca:

Oracle

5.3.8.4 Cuingeachaidhean Coitcheann air Ùrachadh Luath

Tha a’ cheist mu mhìneachadh an t-seallaidh tàthaichte air a chuingealachadh mar a leanas:

  • Chan fhaod iomradh a thoirt air abairtean nach eil ag ath-aithris mar SYSDATE agus ROWNUM.
  • Chan fhaod iomradh a bhith anns an t-sealladh tàbhachdach RAW or LONG RAW seòrsaichean dàta.
  • Chan urrainn dha a SELECT subquery liosta.
  • Chan urrainn gnìomhan anailis a bhith ann (mar eisimpleir, RANK) Anns a SELECT clàs.
  • Chan urrainn dha iomradh a thoirt air clàr air a bheil an XMLIndex clàr-amais air a mhìneachadh.
  • Chan urrainn dha a MODEL clàs.
  • Chan urrainn dha a HAVING clàs le subquery.
  • Chan fhaod ceistean neadachaidh a bhith ann aig a bheil ANY, ALL, no NOT EXISTS.
  • Chan urrainn dha a [START WITH …] CONNECT BY clàs.
  • Chan urrainn dha grunn chlàran mion-fhiosrachaidh a bhith ann aig diofar làraich.
  • ON COMMIT chan urrainn clàran mion-fhiosrachaidh iomallach a bhith aig seallaidhean tàbhachdach.
  • Feumaidh ceangal no cruinneachadh a bhith aig seallaidhean tàthaichte neadachaidh.
  • Seallaidhean ceangail tàbhachdach agus seallaidhean iomlan coileanta le a GROUP BY chan urrainn clàs taghadh bho chlàr a tha air a chur air dòigh le clàr-amais.

5.3.8.5 Cuingeachaidhean air Ùrachadh Luath air Seallaidhean Tàthaichte le Ceangalaichean a-mhàin

A’ mìneachadh cheistean airson beachdan tàbhachdach le ceanglaichean a-mhàin agus chan eil na cuingeachaidhean a leanas air ùrachadh luath air cruinneachaidhean:

  • A h-uile casg bho «Cuingeachaidhean Coitcheann air Ùrachadh Luath".
  • Chan urrainn dhaibh a bhith GROUP BY clàsan no co-chruinneachaidhean.
  • Sreathan de na bùird gu lèir anns an FROM feumaidh an liosta nochdadh anns an SELECT liosta den cheist.
  • Feumaidh logaichean seallaidh tàbhachdach a bhith ann le rowids airson a h-uile clàr bunaiteach anns an FROM liosta den cheist.
  • Chan urrainn dhut sealladh susbainteach luath ath-nuadhachail a chruthachadh bho iomadh clàr le ceangal sìmplidh a tha a’ toirt a-steach colbh seòrsa nì anns an SELECT aithris.

Cuideachd, cha bhi an dòigh ùrachaidh a thaghas tu cho èifeachdach ma tha:

  • Bidh a’ cheist mhìneachaidh a’ cleachdadh ceangal a-muigh a bhios gad ghiùlan fhèin mar cheangal a-staigh. Ma tha ceangal mar seo anns a’ cheist mhìneachaidh, smaoinich air ath-sgrìobhadh a’ cheist mhìneachaidh gus ceangal a-staigh a chumail.
  • Tha SELECT tha liosta den t-sealladh tàthaichte a’ toirt a-steach abairtean air colbhan bho iomadh clàr.

5.3.8.6 Cuingeachaidhean air Ùrachadh Luath air Seallaidhean Tàthaichte le Co-chruinneachaidhean

Tha na cuingeachaidhean a leanas air ùrachadh luath air a bhith a’ mìneachadh cheistean airson beachdan tàbhachdach le co-chruinneachaidhean no còmhla:

Tha taic ri ùrachadh luath airson an dà chuid ON COMMIT agus ON DEMAND beachdan susbainteach, ach tha na cuingeadan a leanas an sàs:

  • Feumaidh logaichean seallaidh tàbhachdach a bhith aig a h-uile clàr san t-sealladh tàbhachdach, agus feumaidh na logaichean seallaidh tàthaichte:
    • Cùm a h-uile colbh bhon chlàr air a bheil iomradh san t-sealladh tàthaichte.
    • Sònraich le ROWID agus INCLUDING NEW VALUES.
    • Sònraich an SEQUENCE clàs ma tha dùil gum bi measgachadh de chuir a-steach / luchdan dìreach, cuir às agus ùrachaidhean air a’ chlàr.

  • a-mhàin SUM, COUNT, AVG, STDDEV, VARIANCE, MIN agus MAX a’ faighinn taic airson ùrachadh luath.
  • COUNT(*) feumar a shònrachadh.
  • Feumaidh gnìomhan iomlan tachairt a-mhàin mar a’ phàirt as fhaide a-muigh den abairt. Is e sin, co-chruinneachaidhean leithid AVG(AVG(x)) or AVG(x)+ AVG(x) chan eil cead aca.
  • Airson gach cruinneachadh mar AVG(expr), an co-fhreagradh COUNT(expr) feumaidh a bhith an làthair. Tha Oracle a’ moladh sin SUM(expr) a shònrachadh.
  • If VARIANCE(expr) or STDDEV(expr) air a shònrachadh, COUNT(expr) agus SUM(expr) feumar a shònrachadh. Tha Oracle a’ moladh sin SUM(expr *expr) a shònrachadh.
  • Tha SELECT chan urrainn don cholbh anns a’ cheist mhìneachaidh a bhith na abairt iom-fhillte le colbhan bho ioma-chlàir bhunaiteach. Is e fuasgladh a dh’ fhaodadh a bhith aig seo sealladh tàbhachdach neadachaidh a chleachdadh.
  • Tha SELECT feumaidh a h-uile càil a bhith anns an liosta GROUP BY colbhan.
  • Chan eil an sealladh tàbhachdach stèidhichte air aon chlàr iomallach no barrachd.
  • Ma chleachdas tu a CHAR seòrsa dàta ann an colbhan sìoltachain log sealladh tàthaichte, feumaidh seataichean caractar a’ phrìomh làrach agus an sealladh tàbhachdach a bhith mar an ceudna.
  • Ma tha aon de na leanas aig an t-sealladh tàbhachdach, chan eil taic ri ùrachadh luath ach air cuir a-steach àbhaisteach DML agus luchdan dìreach.
    • Seallaidhean gnàthaichte le MIN or MAX cruinneachaidhean
    • Seallaidhean gnàthaichte aig a bheil SUM(expr) ach chan eil COUNT(expr)
    • Seallaidhean gnàthaichte às aonais COUNT(*)

    Canar sealladh tàbhachdach mar seo ri sealladh tàthaichte a-mhàin.

  • Sealladh gnàthaichte le MAX or MIN faodar ùrachadh gu sgiobalta às deidh aithrisean DML a dhubhadh às no a mheasgachadh mura h-eil a WHERE clàs.
    Chan eil an aon ghiùlan aig an ùrachadh luath as motha / min às deidh cuir às no DML measgaichte ris a’ chùis cuir a-steach a-mhàin. Bidh e a’ cuir às agus ag ath-aithris na luachan as àirde / as lugha airson na buidhnean air a bheil buaidh. Feumaidh tu a bhith mothachail air a bhuaidh dèanadais.
  • Seallaidhean susbainteach le seallaidhean ainmichte no fo-cheistean anns an FROM faodar clàs ùrachadh gu sgiobalta fhad ‘s a ghabhas na seallaidhean a thoirt còmhla gu tur. Airson fiosrachadh air dè na seallaidhean a thig còmhla, faic Stòr-dàta Oracle SQL Language Reference.
  • Mura h-eil ceanglaichean taobh a-muigh ann, is dòcha gu bheil taghaidhean neo-riaghailteach agad agus gun tèid thu a-steach don WHERE clàs.
  • Faodar seallaidhean iomlan làn-leasaichte le ceangalaichean a-muigh ùrachadh gu sgiobalta às deidh DML àbhaisteach agus luchdan dìreach, fhad ‘s nach eil ach am bòrd a-muigh air atharrachadh. Cuideachd, feumaidh cuingealachaidhean sònraichte a bhith ann air na colbhan ceangail den chlàr ceangail a-staigh. Ma tha ceanglaichean a-muigh ann, feumaidh na ceanglaichean uile a bhith ceangailte ANDs agus feumaidh iad an co-ionannachd a chleachdadh (=) gnìomhaiche.
  • Airson seallaidhean tàthaichte le CUBE, ROLLUP, seataichean buidhne, no co-chòrdadh dhiubh, tha na cuingeadan a leanas an sàs:
    • Tha SELECT bu chòir don liosta a bhith a’ toirt a-steach eadar-dhealachadh buidhne a dh’ fhaodas a bhith na GROUPING_ID gnìomh air na h-uile GROUP BY abairtean no GROUPING gnìomhan aon airson gach fear GROUP BY abairt. Mar eisimpleir, ma tha an GROUP BY is e clàs an t-seallaidh thràthaichte "GROUP BY CUBE(a, b)", an uairsin an SELECT bu chòir an dàrna cuid a bhith anns an liosta "GROUPING_ID(a, b)»No«GROUPING(a) AND GROUPING(b)» airson gum bi an sealladh tàbhachdach furasta ath-nuadhachadh.
    • GROUP BY cha bu chòir dha leantainn gu buidhnean dùblaichte. Mar eisimpleir, "GROUP BY a, ROLLUP(a, b)" chan urrainn dha ath-nuadhachadh gu luath a chionn 's gu bheil buidhnean dùblaichte ann"(a), (a, b), AND (a)".

5.3.8.7 Cuingeachaidhean air Ùrachadh Luath air Seallaidhean Tàthaichte le AONADH A H-UILE

Seallaidhean gnàthaichte leis an UNION ALL taic gnìomhaiche seata an REFRESH FAST roghainn ma tha na cumhaichean a leanas riaraichte:

  • Feumaidh an ceist mhìneachaidh a bhith aig an UNION ALL gnìomhaiche aig an ìre as àirde.

    Tha UNION ALL chan urrainn do ghnìomhaiche a bhith freumhaichte am broinn subquery, le aon eisgeachd: The UNION ALL faodaidh e a bhith ann an subquery anns an FROM clàs fhad ‘s a tha a’ cheist mhìneachaidh den fhoirm SELECT * FROM (sealladh no fo-cheist le UNION ALL) mar anns an eisimpleir a leanas:

    CREATE VIEW view_with_unionall AS (SELECT c.rowid crid, c.cust_id, 2 umarker BHO luchd-ceannach c WHERE c.cust_last_name = 'Smith' UNION A H-UILE SELECT c.rowid crid, c.cust_id, 3 umarker BHO luchd-ceannach c.cust_last_name = 'Jones'); CREATE MATERIALIZED VIEW unionall_inside_view_mv ÙRACHADH FAST AIR IARRTAS MAR SELECT *FROM view_with_unionall;
    

    Thoir an aire gu bheil an sealladh view_with_unionall a’ coinneachadh ris na riatanasan airson ùrachadh luath.

  • A h-uile bloc ceist anns an UNION ALL feumaidh ceist a bhith a’ coinneachadh ri riatanasan sealladh susbainteach ath-nuadhachail luath le cruinneachaidhean no sealladh susbainteach luath ath-nuadhachail le ceangalaichean.

    Feumar na clàran seallaidh iomchaidh iomchaidh a chruthachadh air na bùird mar a dh’ fheumar airson an seòrsa co-fhreagarrach de shealladh susbainteach luath ath-nuadhachail.
    Thoir an aire gu bheil Stòr-dàta Oracle cuideachd a’ ceadachadh cùis shònraichte de shealladh gnàthaichte aon bhòrd le ceanglaichean dìreach air an toirt seachad an ROWID tha colbh air a thoirt a-steach don SELECT liosta agus anns an loga sealladh tàthaichte. Tha seo ri fhaicinn anns a’ cheist mhìneachaidh mun t-sealladh view_with_unionall.

  • Tha SELECT feumaidh liosta de gach ceist a UNION ALL comharradh, agus an UNION ALL feumaidh luach leantainneach àireamhach no sreang a bhith aig colbh anns gach fear UNION ALL meur. A bharrachd air an sin, feumaidh an colbh comharra nochdadh san aon suidheachadh òrdail anns an SELECT liosta de gach bloc ceist. Faic "AONADH A H-UILE Comharran agus Ceist Ath-sgrìobh» airson tuilleadh fiosrachaidh mu dheidhinn UNION ALL comharran.
  • Chan eilear a’ toirt taic do chuid de fheartan leithid ceangalaichean a-muigh, cuir a-steach a-mhàin ceistean seallaidh tàbhachdach iomlan agus bùird iomallach airson seallaidhean tàbhachdach le UNION ALL. Thoir an aire, ge-tà, gum faodar seallaidhean tàbhachdach a thathas a’ cleachdadh ann an ath-riochdachadh, anns nach eil ceangalan no co-chruinneachaidhean, ùrachadh gu sgiobalta nuair UNION ALL no thathas a’ cleachdadh bùird iomallach.
  • Feumaidh am paramadair tòiseachaidh co-chòrdalachd a bhith air a shuidheachadh gu 9.2.0 no nas àirde gus sealladh susbainteach luath ath-nuadhachail a chruthachadh le UNION ALL.

Chan eil mi airson oilbheum a thoirt do luchd-leantainn Oracle, ach a ’breithneachadh leis an liosta de chuingealachaidhean aca, tha e coltach nach deach an uidheamachd seo a sgrìobhadh anns a’ chùis choitcheann, a ’cleachdadh modal air choreigin, ach le mìltean de Innseanaich, far an d’ fhuair a h-uile duine cothrom. sgrìobh am meur fèin, agus rinn gach aon diubh na b'urrainn e, agus rinn e. Tha cleachdadh an uidheamachd seo airson fìor loidsig coltach ri bhith a’ coiseachd tro raon-mèinn. Gheibh thu mhèinnear aig àm sam bith le bhith a 'bualadh air aon de na cuingeachaidhean nach eil follaiseach. Tha mar a tha e ag obair cuideachd na cheist air leth, ach tha e taobh a-muigh raon an artaigil seo.

Microsoft SQL Server

Feumalachdan a Bharrachd

A bharrachd air na roghainnean SET agus riatanasan gnìomh cinntiche, feumar na riatanasan a leanas a choileanadh:

  • An neach-cleachdaidh a chuireas an gnìomh CREATE INDEX feumaidh gur e sealbhadair an t-seallaidh.
  • Nuair a chruthaicheas tu an clàr-amais, bidh an IGNORE_DUP_KEY feumaidh an roghainn a bhith air a shuidheachadh gu OFF (an suidheachadh bunaiteach).
  • Feumaidh ainmean dà-phàirt a bhith air an ainmeachadh air clàran, sgeama.ainm clàr ann an mìneachadh sealladh.
  • Feumar gnìomhan a tha air an sònrachadh leis a’ chleachdaiche air an deach iomradh a thoirt san t-sealladh a chruthachadh le bhith a’ cleachdadh an fhaidhle WITH SCHEMABINDING roghainn.
  • Feumaidh ainmean dà-phàirt iomradh a thoirt air gnìomhan sam bith a tha air am mìneachadh leis a’ chleachdaiche air a bheil iomradh san t-sealladh, ..
  • Feumaidh seilbh ruigsinneachd dàta gnìomh a tha air a mhìneachadh leis an neach-cleachdaidh a bhith NO SQL, agus feumaidh seilbh ruigsinneachd taobh a-muigh a bhith NO.
  • Faodaidh gnìomhan ùine ruith cànain cumanta (CLR) nochdadh ann an liosta taghte an t-seallaidh, ach chan urrainn dhaibh a bhith mar phàirt den mhìneachadh air an iuchair clàr-amais cruinnichte. Chan fhaod gnìomhan CLR nochdadh ann an clàs WHERE den t-sealladh no sa chlàs ON de ghnìomhachd JOIN san t-sealladh.
  • Feumaidh na feartan a bhith aig gnìomhan CLR agus modhan de sheòrsan a tha air an sònrachadh le neach-cleachdaidh CLR a thathar a’ cleachdadh anns a’ mhìneachadh seallaidh mar a chithear sa chlàr a leanas.

    seilbh
    Nota

    DETERMINISTIC = TRUE
    Feumar a bhith air ainmeachadh gu soilleir mar fheart den mhodh Microsoft .NET Framework.

    MION-SGRÙDADH = TRUE
    Feumar a bhith air ainmeachadh gu soilleir mar fheart den dòigh .NET Framework.

    Cothrom dàta = GUN SQL
    Air a dhearbhadh le bhith a’ suidheachadh buadh DataAccess gu DataAccessKind.None agus buadh SystemDataAccess gu SystemDataAccessKind.None.

    ROCHDAIN A-MHÀIN = NO
    Bidh an togalach seo a’ diùltadh gu NO airson cleachdaidhean CLR.

  • Feumaidh an sealladh a bhith air a chruthachadh le bhith a’ cleachdadh an WITH SCHEMABINDING roghainn.
  • Feumaidh an sealladh iomradh a thoirt air clàran bunaiteach a-mhàin a tha san aon stòr-dàta ris an t-sealladh. Chan urrainn don t-sealladh iomradh a thoirt air beachdan eile.
  • Chan fhaod na h-eileamaidean Transact-SQL a leanas a bhith anns an aithris SELECT anns a’ mhìneachadh seallaidh:

    COUNT
    gnìomhan ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, AGUS OPENXML)
    OUTER a' tighinn còmhla(LEFT, RIGHT, no FULL)

    Clàr derived (air a mhìneachadh le bhith a’ sònrachadh a SELECT aithris anns an FROM clàs)
    Fèin-cheangail
    A 'sònrachadh colbhan le bhith a' cleachdadh SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, no AVG
    Abair clàr cumanta (CTE)

    seòladh1, teacsa, teacsa, dealbh, XML, no sruth-faidhle colbhan
    Fo-cheist
    OVER clàs, a tha a’ toirt a-steach gnìomhan rangachaidh no uinneig iomlan

    Ro-aithrisean làn-theacsa (CONTAINS, FREETEXT)
    SUM gnìomh a tha a’ toirt iomradh air abairt nach gabh a ghluasad
    ORDER BY

    Gnìomh iomlan air a mhìneachadh le neach-cleachdaidh CLR
    TOP
    CUBE, ROLLUP, no GROUPING SETS -obrachaidh

    MIN, MAX
    UNION, EXCEPT, no INTERSECT -obrachaidh
    TABLESAMPLE

    Caochladairean clàr
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Seataichean colbhan gann
    Inline (TVF) no gnìomhan luach-clàr ioma-aithris (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 Faodaidh an sealladh clàr-amais a bhith ann seòladh colbhan; ge-tà, chan urrainnear colbhan mar sin a thoirt a-steach don iuchair clàr-amais cruinnichte.

  • If GROUP BY an làthair, feumaidh am mìneachadh VIEW a bhith ann COUNT_BIG(*) agus cha bu chòir a bhith ann HAVING. Tha iad sin GROUP BY chan eil cuingealachaidhean buntainneach ach ris a’ mhìneachadh sealladh clàr-amais. Faodaidh ceist sealladh clàr-amais a chleachdadh anns a’ phlana cur-an-gnìomh aige eadhon ged nach sàsaich e iad sin GROUP BY cuingeachaidhean.
  • Ma tha a GROUP BY clàs, chan urrainn do iuchair a’ chlàr-amais chnuasaichte àraid iomradh a thoirt ach air na colbhan a tha air an sònrachadh san fhaidhle GROUP BY clàs.

Tha e soilleir an seo nach robh na h-Innseanaich an sàs, leis gun do chuir iad romhpa a dhèanamh a rèir an sgeama “cha dèan sinn mòran, ach uill.” Is e sin, tha barrachd mhèinnean aca air an raon, ach tha an suidheachadh aca nas soilleire. Is e an rud as briseadh-dùil an cuingealachadh seo:

Feumaidh an sealladh iomradh a thoirt air clàran bunaiteach a-mhàin a tha san aon stòr-dàta ris an t-sealladh. Chan urrainn don t-sealladh iomradh a thoirt air beachdan eile.

Anns a’ bhriathrachas againn, tha seo a’ ciallachadh nach urrainn do ghnìomh faighinn gu gnìomh tàbhachdach eile. Tha seo a 'gearradh sìos air a h-uile ideòlas anns a' bhud.
Cuideachd, tha an cuingealachadh seo (agus nas fhaide san teacsa) gu mòr a’ lughdachadh nan cùisean cleachdaidh:

Chan fhaod na h-eileamaidean Transact-SQL a leanas a bhith anns an aithris SELECT anns a’ mhìneachadh seallaidh:

COUNT
gnìomhan ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, AGUS OPENXML)
OUTER a' tighinn còmhla(LEFT, RIGHT, no FULL)

Clàr derived (air a mhìneachadh le bhith a’ sònrachadh a SELECT aithris anns an FROM clàs)
Fèin-cheangail
A 'sònrachadh colbhan le bhith a' cleachdadh SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, no AVG
Abair clàr cumanta (CTE)

seòladh1, teacsa, teacsa, dealbh, XML, no sruth-faidhle colbhan
Fo-cheist
OVER clàs, a tha a’ toirt a-steach gnìomhan rangachaidh no uinneig iomlan

Ro-aithrisean làn-theacsa (CONTAINS, FREETEXT)
SUM gnìomh a tha a’ toirt iomradh air abairt nach gabh a ghluasad
ORDER BY

Gnìomh iomlan air a mhìneachadh le neach-cleachdaidh CLR
TOP
CUBE, ROLLUP, no GROUPING SETS -obrachaidh

MIN, MAX
UNION, EXCEPT, no INTERSECT -obrachaidh
TABLESAMPLE

Caochladairean clàr
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Seataichean colbhan gann
Inline (TVF) no gnìomhan luach-clàr ioma-aithris (MSTVF)
OFFSET

CHECKSUM_AGG

Thathas a’ toirmeasg JOINS OUTER, UNION, ORDER BY agus feadhainn eile. Is dòcha gum biodh e na b’ fhasa sònrachadh dè a ghabhadh a chleachdadh seach dè nach gabhadh a chleachdadh. Is dòcha gum biodh an liosta tòrr nas giorra.

Gus geàrr-chunntas a dhèanamh: seata mòr de chuingealachaidhean anns a h-uile (thoir an aire gu malairteach) DBMS vs gin (ach a-mhàin aon loidsigeach, chan e teicnigeach) ann an teicneòlas LGPL. Ach, bu chòir a thoirt fa-near gu bheil buileachadh an uidheamachd seo ann an loidsig dàimheil rudeigin nas duilghe na anns an loidsig gnìomh a chaidh a mhìneachadh.

Реализация

Ciamar a tha e ag obair? Tha PostgreSQL air a chleachdadh mar “inneal mas-fhìor”. Tha algorithm iom-fhillte taobh a-staigh a tha a 'togail cheistean. Seo stòr. Agus chan e dìreach seata mòr de heuristics a th’ ann le dòrlach de ifs. Mar sin, ma tha mìos no dhà agad airson sgrùdadh, faodaidh tu feuchainn ri ailtireachd a thuigsinn.

A bheil e ag obair gu h-èifeachdach? Gu math èifeachdach. Gu mì-fhortanach, tha seo duilich a dhearbhadh. Chan urrainn dhomh a ràdh ach ma smaoinicheas tu air na mìltean de cheistean a tha ann an tagraidhean mòra, gu cuibheasach tha iad nas èifeachdaiche na feadhainn leasaiche math. Faodaidh prògramadair SQL sàr-mhath ceist sam bith a sgrìobhadh nas èifeachdaiche, ach le mìle ceist cha bhith aige ach an togradh no an ùine airson a dhèanamh. Is e an aon rud as urrainn dhomh a ràdh a-nis mar dhearbhadh air èifeachdas gu bheil grunn phròiseactan ag obair air an àrd-ùrlar a chaidh a thogail air an DBMS seo ERP siostaman, aig a bheil mìltean de dhiofar ghnìomhan MATERIALIZED, le mìltean de luchd-cleachdaidh agus stòran-dàta terabyte le ceudan de mhilleanan de chlàran a’ ruith air frithealaiche dà-phròiseasair cunbhalach. Ach, faodaidh duine sam bith èifeachdas a sgrùdadh / a dhiùltadh le bhith a’ luchdachadh sìos àrd-ùrlar agus PostgreSQL, a' tionndadh air a’ logadh cheistean SQL agus a’ feuchainn ris an loidsig agus an dàta atharrachadh an sin.

Anns na h-artaigilean a leanas, bruidhnidh mi cuideachd mu mar as urrainn dhut cuingealachaidhean a shuidheachadh air gnìomhan, obrachadh le seiseanan atharrachaidh, agus mòran a bharrachd.

Source: www.habr.com

Cuir beachd ann