Balance di databasekê de dinivîse û dixwîne

Balance di databasekê de dinivîse û dixwîne
Di berê de gotara Min têgeh û pêkanîna databasek ku li ser bingeha fonksiyonan hatî çêkirin, ne tablo û zeviyan wekî di databasên têkildar de diyar kir. Ew gelek nimûne pêşkêş kir ku avantajên vê nêzîkbûnê li ser ya klasîk nîşan dide. Gelekan dîtin ku ew bi têra xwe razî nînin.

Di vê gotarê de, ez ê destnîşan bikim ka ev têgeh çawa dihêle hûn bi lez û bez hevsengiya nivîsandin û xwendinê li databasê bêyî ti guhertinek di mantiqa xebitandinê de bikin. Karbidestên bi vî rengî hatine ceribandin ku di DBMS-yên bazirganî yên nûjen de (bi taybetî, Oracle û Microsoft SQL Server) bêne bicîh kirin. Di dawiya gotarê de ez ê nîşan bidim ku ya ku wan kir, bi hûrgulî, pir baş neçû.

description

Weke berê, ji bo baştir têgihiştinê ez ê bi mînakan dest bi vegotinê bikim. Em bibêjin ku pêdivî ye ku em mantiqek bicîh bînin ku dê navnîşek beşan bi hejmara karmendan û mûçeya giştî ya wan vegerîne.

Di databasek fonksiyonel de ew ê bi vî rengî xuya bike:

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

Tevliheviya pêkanîna vê pirsê di her DBMS-ê de dê wekhev be O (hejmara karmendan)ji ber ku ev hesab hewce dike ku tevahiya tabloya karmendan bişopîne û dûv re wan li gorî dezgehan kom bike. Di heman demê de dê li gorî plansaziya bijartî hin pêvekên piçûk jî hebin (em bawer dikin ku ji beşan pirtir karmend hene). O (hejmara têketinê ya karmendan) an O (hejmara beşan) ji bo komkirin û hwd.

Eşkere ye ku dibe ku serê darvekirinê di DBMS-yên cihêreng de cûda be, lê tevlihevî bi tu awayî nayê guheztin.

Di pêkanîna pêşniyarê de, DBMS-ya fonksiyonel dê yek jêpirsînek çêbike ku dê ji bo beşê nirxên pêwîst bihesibîne, û dûv re bi tabloya beşê re JOIN çêbike da ku navî bistîne. Lêbelê, ji bo her fonksiyonê, dema ragihandinê, mimkun e ku meriv nîşankerek taybetî ya MATERIALIZED were danîn. Pergal dê bixweber ji bo her fonksiyonek weha zeviyek têkildar biafirîne. Dema ku nirxa fonksiyonek biguhezîne, dê nirxa zeviyê jî di heman danûstendinê de biguheze. Dema ku meriv xwe bigihîne vê fonksiyonê, dê qada pêş-hesabkirî were gihîştin.

Bi taybetî, heke hûn ji bo fonksiyonan MATERIALIZED saz bikin countEmployees и salarySum, paşê dê du qad li ser tabloya bi navnîşa beşan were zêdekirin, ku dê hejmara karmendan û mûçeya giştî ya wan tomar bike. Dema ku di karmendan, mûçeyên wan an girêdanên beşê de guhertinek hebe, pergal dê bixweber nirxên van qadan biguhezîne. Pirsa jorîn dê rasterast bigihîje van qadan û dê tê de were darve kirin O (hejmara beşan).

Sînorkirin çi ne? Tenê yek tişt: fonksiyonek wusa pêdivî ye ku hejmareke bêdawî ya nirxên têketinê hebe ku ji bo nirxa wê tête diyar kirin. Wekî din, ne gengaz e ku meriv tabloyek ku hemî nirxên xwe hilîne were çêkirin, ji ber ku nikare tabloyek bi hejmarek rêzên bêdawî hebe.

Nimûne:

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

Ev fonksiyon ji bo hejmareke bêdawî ya nirxên N-yê tête diyar kirin (mînakek, her nirxek neyînî guncan e). Ji ber vê yekê, hûn nekarin MATERIALIZED li ser wê bixin. Ji ber vê yekê ev tixûbek mentiqî ye, ne teknîkî ye (ango, ne ji ber ku me nekarî wê bicîh bînin). Wekî din, tu sînor tune. Hûn dikarin koman, birêkûpêk, Û û OR, PARTITION, vegerandin, hwd bikar bînin.

Mînakî, di pirsgirêka 2.2 ya gotara berê de, hûn dikarin MATERIALIZED li ser her du fonksiyonan bixin:

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;

Pergal bixwe dê bi bişkojkên tîpan tabloyek çêbike Miştirî, mal и INTEGER, dê du qadan lê zêde bike û bi her guhertinê re dê nirxên zeviyê di wan de nûve bike. Gava ku bêtir bangên van fonksiyonan têne kirin, ew ê neyên hesibandin, lê dê nirx ji qadên têkildar werin xwendin.

Bi karanîna vê mekanîzmayê, hûn dikarin, mînakî, di pirsan de ji vegerandinê (CTE) xilas bibin. Bi taybetî, komên ku bi karanîna pêwendiya zarok / dêûbav darek çêdikin bifikirin (her kom bi dêûbavê xwe re girêdanek heye):

parent = DATA Group (Group);

Di databasek fonksiyonel de, mantiqa vegerê dikare wekî jêrîn were destnîşan kirin:

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;

Ji ber ku ji bo fonksiyonê Parent e MATERIALIZED tê nîşankirin, wê hingê dê tabloyek bi du kilît (kom) ji bo wê were çêkirin, ku tê de qada Parent e dê rast be tenê heke kilîta yekem zarokek ya duyemîn be. Hejmara navnîşên vê tabloyê dê bi hejmara komên ku bi kûrahiya navînî ya darê ve têne zêdekirin wekhev be. Ji bo nimûne, heke hûn hewce ne ku jimara neviyên komek diyar bijmêrin, hûn dikarin vê fonksiyonê bikar bînin:

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

Dê di pirsa SQL de CTE tune be. Di şûna wê de dê GROUP BY sade hebe.

Bi karanîna vê mekanîzmayê, hûn dikarin bi hêsanî databasê jî heke pêwîst be ne normal bikin:

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

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

Dema ku fonksiyonek bang dikin rojek ji bo rêza rêzê, qada ku lê indexek heye dê ji tabloya bi rêzikên rêzê were xwendin. Dema ku tarîxa fermanê diguhezîne, pergal bixwe dê dîroka nenormalkirî ya di rêzê de ji nû ve hesab bike.

avantajên

Ev hemû mekanîzma ji bo çi ye? Di DBMS-yên klasîk de, bêyî ku lêpirsînan ji nû ve binivîsin, pêşdebirek an DBA tenê dikare navnîşan biguhezîne, statîstîkan destnîşan bike û ji plankerê pirsê re bêje ka meriv çawa wan bicîh tîne (û HINT tenê di DBMS-yên bazirganî de hene). Ew çiqas hewl didin jî, ew ê nikaribin pirsa yekem a di gotarê de temam bikin O (hejmara beşan) bêyî guheztina pirsan an lê zêdekirina teşqeleyan. Di pilana pêşniyarkirî de, di qonaxa pêşkeftinê de hûn ne hewce ne ku hûn li ser strukturên hilanînê û kîjan berhevokan bikar bînin bifikirin. Hemî ev dikare bi hêsanî di firînê de, rasterast di operasyonê de were guheztin.

Di pratîkê de ev xuya dike. Hin kes mentiqê rasterast li ser bingeha peywira di dest de pêş dixin. Ew ji algorîtmayan û tevliheviya wan, ne planên darvekirinê, ne celebên tevlêbûnê, ne jî pêkhateyek teknîkî ya din fam nakin. Van kesan ji pêşdebiran bêtir analîstên karsaziyê ne. Dûv re, ev hemî dikeve ceribandin an operasyonê. Têketina pirsên dirêj-dirêj çalak dike. Dema ku pirsek dirêj tê dîtin, wê hingê mirovên din (bêtir teknîkî - bi bingehîn DBA) biryar didin ku MATERIALIZED li ser hin fonksiyonek navîn çalak bikin. Vê yekê tomarkirinê hinekî hêdî dike (ji ber ku ew di danûstendinê de qadek zêde nûvekirina hewce dike). Lêbelê, ne tenê ev pirs bi girîngî bileztir dibe, lê her weha hemî yên din ên ku vê fonksiyonê bikar tînin. Di heman demê de, biryardana ku kîjan fonksiyonê pêk tê bi hêsanî hêsan e. Du pîvanên sereke: hejmara nirxên têketinê yên gengaz (ev çend tomar dê di tabloya têkildar de bin), û çend caran ew di fonksiyonên din de têne bikar anîn.

Analogues

DBMS-yên bazirganî yên nûjen xwedan mekanîzmayên mîna hev in: DÎMENÊN MATERÎALIZED bi NAVENDA NÛÇEYÊN ZÛ (Oracle) û DÎMANA INDEXED (Servera Microsoft SQL). Di PostgreSQL de, DÎMENÊN MATERIALIZED di danûstendinekê de nayê nûve kirin, lê tenê li ser daxwazê ​​(û tewra bi sînorkirinên pir hişk jî), ji ber vê yekê em wê nahesibînin. Lê gelek pirsgirêkên wan hene ku karanîna wan bi girîngî sînordar dike.

Ya yekem, hûn tenê dikarin materyalîzasyonê çalak bikin heke we berê VIEW birêkûpêk çêkiribe. Wekî din, hûn neçar in ku daxwazên mayî ji nû ve binivîsin da ku hûn bigihîjin dîtina nû hatî afirandin da ku vê materyalbûnê bikar bînin. An jî her tiştî wekî xwe bihêlin, lê ew ê bi kêmanî bêbandor be heke hin daneyên berê-hesabkirî hebin, lê gelek pirs her gav wê bikar nakin, lê ji nû ve hesab dikin.

Ya duyemîn jî, hejmareke mezin a qedexeyên wan hene:

Oracle

5.3.8.4 Sînorkirinên Giştî li ser Nûvekirina Bilez

Pirsa diyarker a dîtina materyalkirî bi vî rengî tê sînorkirin:

  • Nêrîna materyalkirî divê referansên îfadeyên ne-dubarekirî yên mîna SYSDATE û ROWNUM.
  • Pêdivî ye ku nêrîna materyalkirî referansên ku tê de nebin RAW or LONG RAW cureyên daneyan.
  • Ew nikare a SELECT jêrpirsiya lîsteyê.
  • Ew nikare fonksiyonên analîtîk bigire (mînak, RANK) hindirê SELECT şert.
  • Ew nikare tabloyek ku li ser an XMLIndex index tê diyarkirin.
  • Ew nikare a MODEL şert.
  • Ew nikare a HAVING bendek bi binavkirî.
  • Ew nikare pirsên hêlînkirî yên ku hene vehewîne ANY, ALL, an NOT EXISTS.
  • Ew nikare a [START WITH …] CONNECT BY şert.
  • Ew nikare gelek tabloyên hûrgulî li malperên cihêreng bigire.
  • ON COMMIT dîtinên maddî nikarin tabloyên hûrguliyên dûr hebin.
  • Nêrînên maddî yên hêlînkirî pêdivî ye ku xwedan hevgirtin an berhevokek be.
  • Nêrînên tevlêbûnê yên materyalîzekirî û nerînên hevgirtî yên materyalkirî bi a GROUP BY bend nikare ji tabloyek-rêxistinkirî hilbijêre.

5.3.8.5 Qedexeyên li ser Nûvekirina Bilez li ser Nêrînên Materyalîzekirî Tenê Bi Tevlîbûnê re

Diyarkirina pirsnameyên ji bo dîtinên maddî yên bi tevlêbûnê tenê û bêyî berhevokan li ser nûvekirina bilez sînorkirinên jêrîn hene:

  • Hemî qedexeyên ji «Sînorkirinên Giştî yên li ser Nûvekirina Bilez".
  • Ew nikarin hebin GROUP BY bend an berhevok.
  • Rêzên hemî tabloyên di nav de FROM divê navnîş di nav de xuya bibe SELECT lîsteya pirsê.
  • Têketinên dîtina materyalkirî divê bi rêzan ji bo hemî tabloyên bingehîn di nav de hebin FROM lîsteya pirsê.
  • Hûn nekarin ji gelek tabloyên bi hevgirêdanên hêsan ên ku stûnek celebek tiştekê di nav de dihewîne dîmenek materyalkirî ya bilez a nûjenkirî biafirînin. SELECT îfade.

Di heman demê de, rêbaza nûvekirinê ya ku hûn hildibijêrin dê ne bikêrhatî be heke:

  • Lêpirsîna diyarker tevlêbûnek derveyî bikar tîne ku mîna tevlêbûnek hundurîn tevdigere. Ger pirsiyara diyarker tevlêbûnek wusa dihewîne, ji nû ve binivîsin ku lêpirsîna diyarker da ku tevlêbûnek hundurîn hebe.
  • Ew SELECT navnîşa dîtina maddî îfadeyên li ser stûnên ji gelek tabloyan vedihewîne.

5.3.8.6 Qedexekirinên li ser Nûvekirina Bilez li ser Nêrînên Materyalkirî yên Bi Tevhevan

Diyarkirina pirsnameyên ji bo dîtinên maddî yên bi tevhevî an tevlêbûnê re li ser nûvekirina bilez sînorkirinên jêrîn hene:

Nûvekirina bilez ji bo herduyan jî piştgirî ye ON COMMIT û ON DEMAND dîtinên maddî, di heman demê de qedexeyên jêrîn têne sepandin:

  • Pêdivî ye ku hemî tabloyên di dîtina materyalkirî de têketinên dîtina materyalkirî hebin, û têketinên dîtina materyalkirî divê:
    • Hemî stûnên ji tabloya ku di dîmena materyalkirî de hatî referansê vedihewîne.
    • Bi diyar bike ROWID û INCLUDING NEW VALUES.
    • Binivîse SEQUENCE bend ger tê çaverêkirin ku tablo tevliheviyek têkel / rasterast-barkirin, jêbirin, û nûvekirinê hebe.

  • Bes SUM, COUNT, AVG, STDDEV, VARIANCE, MIN û MAX ji bo nûvekirina bilez têne piştgirî kirin.
  • COUNT(*) divê bê diyarkirin.
  • Pêdivî ye ku fonksiyonên tevhev tenê wekî beşa herî derveyî ya vegotinê pêk were. Yanî kombûnên wekî AVG(AVG(x)) or AVG(x)+ AVG(x) nahêlin.
  • Ji bo her kombûnek wekî AVG(expr), têkildar COUNT(expr) divê hebin. Oracle wê pêşniyar dike SUM(expr) were diyar kirin.
  • If VARIANCE(expr) or STDDEV(expr) tê diyarkirin, COUNT(expr) û SUM(expr) divê bê diyarkirin. Oracle wê pêşniyar dike SUM(expr *expr) were diyar kirin.
  • Ew SELECT stûna di pirsiyara diyarker de nikare bi stûnên ji gelek tabloyên bingehîn re bêjeyek tevlihev be. Rêbazek gengaz a vê yekê karanîna nerînek materyalkirî ya hêlîn e.
  • Ew SELECT lîste divê hemî hebin GROUP BY stûnên.
  • Nêrîna materyalkirî ne li ser yek an çend tabloyên dûr e.
  • Ger hûn bikar bînin a CHAR Tîpa daneyê di stûnên parzûnê yên têketinek dîtina maddî de, komên karakterên malpera master û dîtina materyalkirî divê yek bin.
  • Ger dîtina materyalkirî yek ji jêrîn hebe, wê hingê nûvekirina bilez tenê li ser têkelên DML-ya kevneşopî û barkirina rasterast tê piştgirî kirin.
    • views Materialized bi MIN or MAX komkirin
    • Nêrînên materyalîzekirî yên ku hene SUM(expr) lê na COUNT(expr)
    • Dîtinên materyalîzekirî bêyî COUNT(*)

    Nêrînek wusa materyalkirî wekî dîtina maddî-tenê tê gotin.

  • Nêrînek maddî bi MAX or MIN piştî jêbirin an tevlihevkirina daxuyaniyên DML-ê heke a-ya wê tune be zû tê nûve kirin WHERE şert.
    Nûvekirina bilez a herî zêde / hûrdem piştî jêbirin an DML-ya tevlihev ne xwedî heman tevgerê ye ku doza tenê-tenê têxe. Ew ji bo komên bandorkirî nirxên herî zêde / hindik jê dike û ji nû ve hesab dike. Pêdivî ye ku hûn ji bandora performansa wê haydar bin.
  • Nêrînên materyalîzekirî yên bi dîtinên binavkirî an binavkirî di nav de FROM bend dikare zû were nûve kirin bi şertê ku nêrîn bi tevahî werin yek kirin. Ji bo agahdariya li ser kîjan nêrîn dê bi hev re bibin, binêre Çavkaniya Zimanê Oracle Database SQL.
  • Ger girêdanên derveyî tunebin, dibe ku hûn vebijarkên keyfî hebin û tê de beşdar bibin WHERE şert.
  • Nêrînên tevhev ên materyalî yên bi girêdanên derveyî zû têne nûve kirin piştî DML-ya kevneşopî û barkirinên rasterast, bi şertê ku tenê tabloya derve were guheztin. Di heman demê de, pêdivî ye ku li ser stûnên tevlêbûnê yên tabloya tevlêbûna hundurîn astengiyên bêhempa hebin. Ger girêdanên derve hebin, divê hemî girêdan bi hev ve werin girêdan ANDs û divê wekheviyê bikar bînin (=) operator.
  • Ji bo dîtinên maddî bi CUBE, ROLLUP, komkirina koman, an berhevkirina wan, qedexeyên jêrîn têne sepandin:
    • Ew SELECT lîste divê cihêkarê kombûnê hebe ku dikare bibe a GROUPING_ID fonksiyona li ser hemû GROUP BY îfadeyan an GROUPING ji bo her yekê yek fonksiyon dike GROUP BY îfade. Mînakî, heke GROUP BY xala nêrîna materyalkirî ev e "GROUP BY CUBE(a, b)", paşê SELECT lîste divê hebe "GROUPING_ID(a, b)» an «GROUPING(a) AND GROUPING(b)» ji bo ku nêrîna materyalkirî zû were nûvekirin.
    • GROUP BY divê tu komên dubare nebin. Bo nimûne, "GROUP BY a, ROLLUP(a, b)"Bi lez nayê nûvekirin ji ber ku ew di komên dubare de encam dide"(a), (a, b), AND (a)".

5.3.8.7 Qedexeyên li ser Nûvekirina Bilez li ser Nêrînên Materyalkirî bi UNION ALL

Nêrînên materyalîzekirî bi UNION ALL piştgirîya operatorê saz bike REFRESH FAST vebijark heke şertên jêrîn têr bibin:

  • Divê pirsa diyarker hebe UNION ALL operator di asta jor de.

    Ew UNION ALL operator nikare di hundurê pirsnameyekê de were bicîh kirin, bi yek îstîsna: The UNION ALL dikare di binpirsekê de be FROM bend tê peyda kirin ku pirsa diyarker bi vî rengî ye SELECT * FROM (dîtin an jêrpirsîn bi UNION ALL) wek mînaka jêrîn:

    BİXWÎNE BİXWÎNE view_with_unionall AS (c.rowid crid, c.cust_id, 2 umarker JI xerîdarên c WHERE c.cust_last_name = 'Smith' UNION ALL SELECT c.rowid crid, c.cust_id, 3 nîşanker JI xerîdar c WHERE c. 'Jones'); DÎMENA MATERÎALIZED AFERÎNIN unionall_inside_view_mv LI SER DAXWAZÊ LÊZ NÛ NÛ BIKIN * JI view_with_unionall;
    

    Bala xwe bidinê ku dîtin view_with_unionall daxwazên ji bo nûvekirina bilez têr dike.

  • Her bloka pirsê di nav de UNION ALL Lêpirsîn pêdivî ye ku hewcedariyên dîmenek materyalkirî ya zû nûvekirî ya bi tevhevan an jî dîmenek materyalkirî ya zû nûvekirina bi tevlêbûnê têr bike.

    Pêdivî ye ku têketinên dîtina maddî yên guncav li ser tabloyan bêne çêkirin ku ji bo celebê têkildar a dîtina maddî ya ku zû nûvekirin tê xwestin.
    Bala xwe bidinê ku Daneya Oracle di heman demê de rê dide rewşa taybetî ya tabloyek yekane ku bi tevlêbûnên tenê têne peyda kirin ROWID stûn di nav de cih girtiye SELECT navnîş û di têketina dîtina materyalkirî de. Ev di pirsa diyarker a dîtinê de tê xuyang kirin view_with_unionall.

  • Ew SELECT lîsteya her pirsê divê a UNION ALL nîşanker, û UNION ALL stûn divê di her yekê de nirxek jimarek an rêzikê ya domdar a cihêreng hebe UNION ALL gûlî. Wekî din, stûna nîşanker divê di heman pozîsyona rêzdar de xuya bibe SELECT navnîşa her bloka pirsê. Binêre"UNION ALL Marker and Query Rewrite»ji bo bêtir agahdarî li ser UNION ALL marker.
  • Hin taybetmendî, wek hevgirtinên derve, lêpirsînên dîtina materyalkirî yên tevhev-tenê têxin û tabloyên dûr ji bo dîtinên maddî yên bi UNION ALL. Lêbelê, bala xwe bidin ku nêrînên maddî yên ku di dubarekirinê de têne bikar anîn, yên ku tevhev û berhevokan nagirin, dema ku zû werin nûve kirin UNION ALL an tabloyên dûr tên bikaranîn.
  • Pêdivî ye ku pîvana destpêkirina lihevhatinê li 9.2.0 an mezintir were saz kirin da ku dîmenek materyalî ya bilez a nûvekirî biafirîne. UNION ALL.

Ez naxwazim temaşevanên Oracle aciz bikim, lê li gorî navnîşa qedexeyên wan dadbar, wusa dixuye ku ev mekanîzma ne di rewşa gelemperî de, bi karanîna cûreyek modelê, lê ji hêla hezaran Hindî ve hatî nivîsandin, ku li wir ji her kesî re fersendek hate dayîn. şaxê xwe binivîse û her yekî ji wan çi ji destê wî hat kirin û kir. Bikaranîna vê mekanîzmayê ji bo mantiqa rastîn mîna rêveçûna di qada mayinkirî de ye. Hûn dikarin di her kêliyê de bi lêdana yek ji qedexeyên ne diyar mînek bistînin. Çawa ew çawa dixebite jî pirsek cuda ye, lê ew li derveyî çarçoveya vê gotarê ye.

Microsoft SQL Server

Pêdivî ye

Ji bilî vebijarkên SET û hewcedariyên fonksiyonê diyarker, pêdivî ye ku pêdivîyên jêrîn bêne bicîh kirin:

  • Bikarhênerê ku îdam dike CREATE INDEX divê xwediyê dîtinê be.
  • Dema ku hûn îndeksê diafirînin, wê IGNORE_DUP_KEY divê vebijêrk li ser OFF were danîn (mîhenga xwerû).
  • Pêdivî ye ku tablo bi navên du-beşî ve were referans kirin, schema.navê sifrê di pênaseya dîtinê de.
  • Pêdivî ye ku fonksiyonên ku ji hêla bikarhêner ve hatî destnîşan kirin di dîtinê de bi karanîna ve bêne afirandin WITH SCHEMABINDING dibe.
  • Her fonksiyonên diyarkirî yên bikarhêner ên ku di dîtinê de têne referans kirin divê bi navên du-beş ve bêne referans kirin, ..
  • Divê taybetmendiya gihîştina daneyê ya fonksiyonek diyarkirî ya bikarhêner be NO SQL, û milkê gihîştina derveyî divê hebe NO.
  • Fonksiyonên dema xebitandina zimanê hevpar (CLR) dikarin di navnîşa hilbijartî ya dîtinê de xuya bibin, lê nekarin bibin beşek ji pênasekirina mifteya pêveka komkirî. Fonksiyonên CLR nikarin di xala WHERE ya dîtinê de an jî xala ON a operasyonek JOIN-ê di dîtinê de xuya bikin.
  • Fonksiyon û rêbazên CLR yên celebên diyarkirî yên CLR-ê yên ku di pênaseya dîtinê de têne bikar anîn divê xwedî taybetmendiyên ku di tabloya jêrîn de têne destnîşan kirin hebin.

    Mal
    Not

    DETERMINISTIC = RAST
    Pêdivî ye ku bi eşkere wekî taybetmendiyek rêbaza Microsoft .NET Framework were ragihandin.

    PRECISE = RAST
    Pêdivî ye ku bi eşkere wekî taybetmendiyek rêbaza .NET Framework were ragihandin.

    DATA GIRTIN = SQL TUNE
    Bi danîna taybetmendiya DataAccess li DataAccessKind.None û taybetmendiya SystemDataAccess li SystemDataAccessKind.None ve hatî destnîşankirin.

    GIRTÎNA DERVE = NA
    Vê taybetmendiyê ji bo rûtînên CLR-ê wekî NO-ê vedigire.

  • Nêrîn divê bi karanîna ve were afirandin WITH SCHEMABINDING dibe.
  • Pêdivî ye ku nihêrîn tenê tabloyên bingehîn ên ku di heman databasê de ne referansa xwe bike. Nêrîn nikare nêrînên din referans bike.
  • Daxuyaniya SELECT di pênaseya dîtinê de divê hêmanên Transact-SQL yên jêrîn nehewîne:

    COUNT
    fonksiyonên ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, OPENXML)
    OUTER tevlî dibe(LEFT, RIGHT, an FULL)

    Tabloya derkirî (bi diyarkirina a SELECT daxuyanî di FROM şert)
    Xwe tevlî dibe
    Bi karanîna stûnan diyar dikin SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, an AVG
    Gotina tabloya hevpar (CTE)

    avbazîn1, nivîstok, ntext, wêne, XML, an filestream stûnên
    Subquery
    OVER bend, ku tê de fonksiyonên paceyê rêzkirin an hevgirtî vedihewîne

    Pêşniyarên tev-nivîsê (CONTAINS, FREETEXT)
    SUM fonksiyona ku îfadeya nullable referans dike
    ORDER BY

    Fonksiyona tevhev a ku ji hêla bikarhêner ve hatî diyar kirin CLR
    TOP
    CUBE, ROLLUP, an GROUPING SETS operator

    MIN, MAX
    UNION, EXCEPT, an INTERSECT operator
    TABLESAMPLE

    Guherbarên sifrê
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Sparse stûnên sets
    Inline (TVF) an fonksiyonên bi nirx-nirxa tabloya pir-daxuyan (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 Dîtina pêvekirî dikare hebe avbazîn columns; lêbelê, stûnên weha nikarin di nav mifteya pêveka komkirî de cih bigirin.

  • If GROUP BY heye, pênaseya VIEW divê hebe COUNT_BIG(*) û divê nebe HAVING. Eva GROUP BY sînorkirin tenê ji bo pênaseya dîtina pêvekirî têne sepandin. Lêpirsînek dikare di plansaziya darvekirina xwe de dîmenek îndekskirî bikar bîne heke ew van têr neke jî GROUP BY sînor
  • Ger pênaseya dîtinê a GROUP BY bend, mifteya nîşaneya komkirî ya yekta dikare tenê stûnên ku di nav de hatine destnîşan kirin referans bike GROUP BY şert.

Li vir eşkere ye ku Hindistan tevlî nebûne, ji ber ku wan biryar da ku wê li gorî nexşeya "em ê hindik, lê baş bikin" bikin. Yanî li qadê zêdetir mayinên wan hene, lê cihê wan zelaltir e. Tişta herî xemgîn ev sînor e:

Pêdivî ye ku nihêrîn tenê tabloyên bingehîn ên ku di heman databasê de ne referansa xwe bike. Nêrîn nikare nêrînên din referans bike.

Di termînolojiya me de, ev tê vê wateyê ku fonksiyonek nikare xwe bigihîne fonksiyonek din a materyalkirî. Bi vê yekê hemû îdeolojiyên di zikhev de qut dike.
Di heman demê de, ev sînor (û bêtir di nivîsê de) dozên karanîna pir kêm dike:

Daxuyaniya SELECT di pênaseya dîtinê de divê hêmanên Transact-SQL yên jêrîn nehewîne:

COUNT
fonksiyonên ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, OPENXML)
OUTER tevlî dibe(LEFT, RIGHT, an FULL)

Tabloya derkirî (bi diyarkirina a SELECT daxuyanî di FROM şert)
Xwe tevlî dibe
Bi karanîna stûnan diyar dikin SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, an AVG
Gotina tabloya hevpar (CTE)

avbazîn1, nivîstok, ntext, wêne, XML, an filestream stûnên
Subquery
OVER bend, ku tê de fonksiyonên paceyê rêzkirin an hevgirtî vedihewîne

Pêşniyarên tev-nivîsê (CONTAINS, FREETEXT)
SUM fonksiyona ku îfadeya nullable referans dike
ORDER BY

Fonksiyona tevhev a ku ji hêla bikarhêner ve hatî diyar kirin CLR
TOP
CUBE, ROLLUP, an GROUPING SETS operator

MIN, MAX
UNION, EXCEPT, an INTERSECT operator
TABLESAMPLE

Guherbarên sifrê
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Sparse stûnên sets
Inline (TVF) an fonksiyonên bi nirx-nirxa tabloya pir-daxuyan (MSTVF)
OFFSET

CHECKSUM_AGG

TEVLÊBÛNA DERVE, YEKÎTIYA, ORDER BY û yên din qedexe ne. Dibe ku hêsantir bûya ku meriv diyar bike ka çi dikare were bikar anîn ji ya ku nayê bikar anîn. Dibe ku navnîş dê pir piçûktir be.

Bi kurtasî: di teknolojiya LGPL de di her (bila em bala xwe bidin bazirganî) DBMS-ê li hember tune (ji bilî yek mentiqî, ne teknîkî) hejmareke mezin a qedexeyan. Lêbelê, divê were zanîn ku pêkanîna vê mekanîzmayê di mantiqa pêwendiyê de ji ya mantiqa fonksiyonel a diyarkirî hinekî dijwartir e.

Реализация

Çawa dixebite? PostgreSQL wekî "makîneyek virtual" tê bikar anîn. Di hundurê de algorîtmayek tevlihev heye ku pirsan çêdike. Vir kanî. Û ne tenê komek mezin a heuristics bi komek heke-yan heye. Ji ber vê yekê, heke we çend meh ji bo xwendinê heye, hûn dikarin hewl bidin ku mîmarî fam bikin.

Ma ew bi bandor dixebite? Pir bi bandor. Mixabin, ev zehmet e ku îspat bike. Ez tenê dikarim bibêjim ku heke hûn bi hezaran pirsên ku di serîlêdanên mezin de hene bifikirin, wê hingê ew bi gelemperî ji yên pêşdebirek baş bikêrtir in. Bernamesazek ​​SQL-ya hêja dikare her pirsê bi bandortir binivîsîne, lê bi hezar pirsan re ew ê bi tenê motîvasyon an wextê wî tune be. Tişta ku ez naha dikarim wekî delîla bandorkeriyê bibêjim ev e ku gelek proje li ser platforma ku li ser vê DBMS-ê hatî çêkirin dixebitin dixebitin. sîstemên ERP, ku bi hezaran fonksiyonên MATERIALIZED ên cihêreng hene, bi hezaran bikarhêner û databasên terabyte yên ku bi sed mîlyonan tomar li ser serverek du-processor bi rêkûpêk dixebitin hene. Lêbelê, her kes dikare bi dakêşandinê ve bandorkeriyê kontrol bike / red bike rawesta axaftevan û PostgreSQL, zivirandin pirsên SQL têketin û hewl didin ku mantiq û daneyan li wir biguhezînin.

Di gotarên jêrîn de, ez ê her weha biaxivim ka hûn çawa dikarin li ser fonksiyonan sînordar bikin, bi danişînên guhartinê re bixebitin, û hêj bêtir.

Source: www.habr.com

Add a comment