Pagbalanse sa pagsulat ug pagbasa sa usa ka database

Pagbalanse sa pagsulat ug pagbasa sa usa ka database
Sa miaging artikulo Gihubit nako ang konsepto ug pagpatuman sa usa ka database nga gitukod pinasukad sa mga gimbuhaton, kaysa mga lamesa ug mga natad sama sa mga database sa relational. Naghatag kini daghang mga pananglitan nga nagpakita sa mga bentaha sa kini nga pamaagi kaysa sa klasiko. Daghan ang nakakaplag kanila nga dili igo nga makapakombinsir.

Niini nga artikulo, ipakita nako kung giunsa kini nga konsepto nagtugot kanimo nga dali ug dali nga balansehon ang pagsulat ug pagbasa sa database nga wala’y pagbag-o sa lohika sa operasyon. Ang susama nga gamit gisulayan nga ipatuman sa modernong komersyal nga mga DBMS (sa partikular, Oracle ug Microsoft SQL Server). Sa katapusan sa artikulo akong ipakita nga kung unsa ang ilang gibuhat, aron ibutang kini sa kalumo, dili kaayo maayo.

paghulagway

Sama sa kaniadto, alang sa mas maayo nga pagsabut sugdan nako ang paghulagway sa mga pananglitan. Ingnon ta nga kinahanglan natong ipatuman ang lohika nga magbalik sa usa ka lista sa mga departamento nga adunay gidaghanon sa mga empleyado niini ug ang ilang kinatibuk-ang suweldo.

Sa usa ka functional database kini tan-awon sama niini:

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

Ang pagkakomplikado sa pagpatuman niini nga pangutana sa bisan unsang DBMS mahimong katumbas sa O (gidaghanon sa mga empleyado)tungod kay kini nga kalkulasyon nanginahanglan pag-scan sa tibuuk nga lamesa sa mga empleyado ug dayon paggrupo sila sa departamento. Adunay usab gamay (kami nagtuo nga adunay daghang mga empleyado kaysa mga departamento) nga suplemento depende sa gipili nga plano O(log nga gidaghanon sa mga empleyado) o O(gidaghanon sa mga departamento) para sa paggrupo ug uban pa.

Klaro nga ang overhead sa pagpatuman mahimong lahi sa lainlaing mga DBMS, apan ang pagkakomplikado dili mausab sa bisan unsang paagi.

Sa gisugyot nga pagpatuman, ang functional DBMS makamugna og usa ka subquery nga magkalkula sa gikinahanglan nga mga kantidad alang sa departamento, ug dayon maghimo og JOIN sa lamesa sa departamento aron makuha ang ngalan. Bisan pa, alang sa matag function, kung nagpahayag, posible nga magbutang usa ka espesyal nga MATERIALIZED nga marka. Ang sistema awtomatiko nga maghimo usa ka katugbang nga uma alang sa matag ingon nga function. Kung usbon ang bili sa usa ka function, ang bili sa field mausab usab sa samang transaksyon. Sa pag-access niini nga function, ang na-pre-calculated field ma-access.

Sa partikular, kung imong gibutang ang MATERIALIZED alang sa mga gimbuhaton ihap mga Empleyado и sweldoSum, unya duha ka natad ang idugang sa lamesa nga adunay lista sa mga departamento, nga magtipig sa gidaghanon sa mga empleyado ug sa ilang kinatibuk-ang suweldo. Kung adunay pagbag-o sa mga empleyado, ilang suweldo o mga kaakibat sa departamento, awtomatiko nga usbon sa sistema ang mga kantidad sa kini nga mga natad. Ang pangutana sa ibabaw direktang maka-access niini nga mga natad ug ipatuman sa O(gidaghanon sa mga departamento).

Unsa ang mga pagdili? Usa ra ka butang: ang ingon nga function kinahanglan adunay usa ka limitado nga gidaghanon sa mga kantidad sa input diin gihubit ang kantidad niini. Kung dili, imposible nga magtukod usa ka lamesa nga nagtipig sa tanan nga mga kantidad niini, tungod kay dili mahimo nga usa ka lamesa nga adunay walay kinutuban nga gidaghanon sa mga laray.

Pananglitan:

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

Kini nga function gihubit alang sa usa ka walay kinutuban nga gidaghanon sa mga kantidad sa N (pananglitan, bisan unsang negatibo nga kantidad ang angay). Busa, dili nimo ibutang ang MATERIALIZED niini. Mao nga kini usa ka lohikal nga limitasyon, dili usa ka teknikal (kana, dili tungod kay dili naton kini mapatuman). Kung dili, wala’y mga pagdili. Mahimo nimong gamiton ang mga paggrupo, paghan-ay, UG ug O, PARTITION, recursion, ug uban pa.

Pananglitan, sa problema 2.2 sa miaging artikulo, mahimo nimong ibutang ang MATERIALIZED sa duha ka mga gimbuhaton:

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;

Ang sistema mismo maghimo usa ka lamesa nga adunay mga yawe sa tipo Customer, Product и INTEGER, magdugang og duha ka field niini ug mag-update sa field values ​​niini sa bisan unsang kausaban. Kung gihimo ang dugang nga mga tawag sa kini nga mga gimbuhaton, dili kini kalkulado, apan ang mga kantidad basahon gikan sa katugbang nga mga natad.

Gamit kini nga mekanismo, mahimo nimo, pananglitan, makuha ang mga recursion (CTE) sa mga pangutana. Sa partikular, ikonsiderar ang mga grupo nga nagporma og kahoy gamit ang relasyon sa bata/ginikanan (matag grupo adunay link sa ginikanan niini):

parent = DATA Group (Group);

Sa usa ka functional database, ang recursion logic mahimong matino sama sa mosunod:

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;

Tungod kay alang sa function ang Ginikanan gimarkahan nga MATERIALIZED, unya usa ka lamesa nga adunay duha ka yawe (mga grupo) pagabuhaton alang niini, diin ang uma ang Ginikanan mahimong tinuod lamang kon ang unang yawe kay anak sa ikaduha. Ang gidaghanon sa mga entries niini nga lamesa mahimong katumbas sa gidaghanon sa mga grupo nga gipadaghan sa kasagaran nga giladmon sa kahoy. Kung kinahanglan nimo, pananglitan, aron maihap ang gidaghanon sa mga kaliwat sa usa ka grupo, mahimo nimong gamiton kini nga function:

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

Walay CTE sa SQL nga pangutana. Hinuon adunay usa ka yano nga GROUP BY.

Gamit kini nga mekanismo, dali ra nimo ma-denormalize ang database kung kinahanglan:

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

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

Kung nagtawag sa usa ka function petsa alang sa linya sa pag-order, ang natad diin adunay indeks ang basahon gikan sa lamesa nga adunay mga linya sa order. Kung mabag-o ang petsa sa pag-order, ang sistema mismo awtomatik nga magkalkula pag-usab sa denormalized nga petsa sa linya.

Kaayohan

Para sa unsa kining tibuok nga mekanismo? Sa mga klasiko nga DBMS, nga wala’y pagsulat pag-usab sa mga pangutana, ang usa ka developer o DBA mahimo ra magbag-o sa mga indeks, mahibal-an ang mga estadistika ug isulti sa tigplano sa pangutana kung giunsa kini ipatuman (ug ang mga HINT magamit ra sa mga komersyal nga DBMS). Bisan unsa pa sila kalisud, dili nila makompleto ang unang pangutana sa artikulo sa O (gidaghanon sa mga departamento) nga walay pagbag-o sa mga pangutana o pagdugang sa mga trigger. Sa gisugyot nga laraw, sa yugto sa pag-uswag dili nimo kinahanglan hunahunaon ang istruktura sa pagtipig sa datos ug kung unsang mga aggregasyon ang gamiton. Kining tanan dali nga mabag-o sa langaw, direkta sa operasyon.

Sa praktis kini ingon niini. Ang ubang mga tawo nagpalambo sa lohika nga direkta base sa buluhaton sa kamot. Wala sila makasabut sa mga algorithm ug sa ilang pagkakomplikado, ni mga plano sa pagpatuman, ni mga tipo sa pag-apil, ni bisan unsang ubang teknikal nga sangkap. Kini nga mga tawo mas daghang analista sa negosyo kaysa mga developer. Unya, kining tanan moadto sa pagsulay o operasyon. Makapahimo sa pag-log sa dugay na nga mga pangutana. Kung makit-an ang usa ka taas nga pangutana, ang ubang mga tawo (mas teknikal - labi nga DBA) ang modesisyon nga mahimo ang MATERIALIZED sa pipila nga intermediate function. Kini nagpahinay sa pagrekord og gamay (tungod kay nagkinahanglan kini og pag-update sa dugang nga field sa transaksyon). Bisan pa, dili lamang kini nga pangutana ang labi nga gipadali, apan ang uban pa nga naggamit niini nga function. Sa parehas nga oras, ang pagdesisyon kung unsang function ang matuman medyo dali. Duha ka punoan nga mga parameter: ang gidaghanon sa posible nga mga kantidad sa pag-input (kini kung pila ang mga rekord sa katugbang nga lamesa), ug kung unsa ka sagad kini gigamit sa ubang mga gimbuhaton.

Mgaalog

Ang mga modernong komersyal nga DBMS adunay susama nga mga mekanismo: MATERIALIZED VIEW nga adunay FAST REFRESH (Oracle) ug INDEXED VIEW (Microsoft SQL Server). Sa PostgreSQL, ang MATERIALIZED VIEW dili ma-update sa usa ka transaksyon, apan sa hangyo lamang (ug bisan sa estrikto kaayo nga mga pagdili), mao nga wala namo kini tagda. Apan sila adunay daghang mga problema nga naglimite sa ilang paggamit.

Una, mahimo ra nimo ma-enable ang materialization kung nakabuhat ka na ug regular nga VIEW. Kung dili, kinahanglan nimo nga isulat pag-usab ang nahabilin nga mga hangyo aron ma-access ang bag-ong nahimo nga pagtan-aw aron magamit kini nga materyalisasyon. O ibilin ang tanan nga ingon niini, apan kini labing menos dili epektibo kung adunay piho nga na-pre-calculated nga datos, apan daghang mga pangutana ang dili kanunay mogamit niini, apan kalkulado kini pag-usab.

Ikaduha, sila adunay daghang mga pagdili:

pulong sa Dios

5.3.8.4 Kinatibuk-ang mga Pagdili sa Fast Refresh

Ang paghubit nga pangutana sa materyal nga pagtan-aw gipugngan sama sa mosunod:

  • Ang materyal nga pagtan-aw kinahanglan dili maglangkob sa mga pakisayran sa dili gibalikbalik nga mga ekspresyon sama SYSDATE ug ROWNUM.
  • Ang materyal nga pagtan-aw kinahanglan dili adunay mga pakisayran sa RAW or LONG RAW mga tipo sa datos.
  • Dili kini adunay sulod nga a SELECT listahan subquery.
  • Dili kini adunay mga analytical function (pananglitan, RANK) sa SELECT clause.
  • Dili kini maghisgot sa usa ka lamesa diin ang usa ka XMLIndex gihubit ang indeks.
  • Dili kini adunay sulod nga a MODEL clause.
  • Dili kini adunay sulod nga a HAVING clause nga adunay subquery.
  • Dili kini adunay mga nested nga pangutana nga adunay ANY, ALL, o NOT EXISTS.
  • Dili kini adunay sulod nga a [START WITH …] CONNECT BY clause.
  • Dili kini adunay daghang mga lamesa sa detalye sa lainlaing mga site.
  • ON COMMIT Ang materyal nga mga panan-aw dili mahimong adunay hilit nga mga lamesa sa detalye.
  • Ang mga nested materialized nga mga panan-aw kinahanglan adunay usa ka sumpay o aggregate.
  • Materyalisado nga pag-apil sa mga panan-aw ug materialized aggregate nga mga panan-aw nga adunay a GROUP BY Ang clause dili makapili gikan sa usa ka index-organized nga lamesa.

5.3.8.5 Mga Pagdili sa Fast Refresh sa Materialized Views with Joins Only

Ang paghubit sa mga pangutana alang sa materyal nga mga pagtan-aw nga adunay mga pag-apil lamang ug walay mga aggregate adunay mosunod nga mga pagdili sa paspas nga pag-refresh:

  • Ang tanan nga mga pagdili gikan sa "Kinatibuk-ang mga Pagdili sa Fast Refresh".
  • Dili nila mahimo GROUP BY clause o aggregates.
  • Rowids sa tanang mga lamesa sa FROM lista kinahanglan nga makita sa SELECT listahan sa pangutana.
  • Ang mga materyal nga talan-awon sa talan-awon kinahanglan nga adunay mga rowids alang sa tanan nga base nga mga lamesa sa FROM listahan sa pangutana.
  • Dili ka makahimo og paspas nga ma-refresh nga materialized nga panglantaw gikan sa daghang mga lamesa nga adunay yano nga pag-apil nga naglakip sa usa ka butang nga tipo nga kolum sa SELECT pamahayag.

Usab, ang pamaagi sa pag-refresh nga imong gipili dili maayo nga episyente kung:

  • Ang paghubit nga pangutana naggamit sa usa ka gawas nga pagdugtong nga naglihok sama sa usa ka sulud sa sulud. Kung ang nagpatin-aw nga pangutana adunay ingon nga usa ka pag-apil, hunahunaa ang pagsulat pag-usab sa pagtino nga pangutana aron adunay sulud nga sulud.
  • ang SELECT lista sa materyal nga pagtan-aw adunay mga ekspresyon sa mga kolum gikan sa daghang mga lamesa.

5.3.8.6 Mga Pagdili sa Fast Refresh sa Materialized Views with Aggregates

Ang paghubit sa mga pangutana alang sa materyal nga mga panan-aw nga adunay mga aggregate o pag-apil adunay mga mosunod nga mga pagdili sa paspas nga pag-refresh:

Gisuportahan ang paspas nga pag-refresh alang sa duha ON COMMIT ug ON DEMAND materyalized nga mga panan-aw, apan ang mosunod nga mga pagdili magamit:

  • Ang tanan nga mga lamesa sa materyal nga pagtan-aw kinahanglan adunay materyal nga pagtan-aw log, ug ang materyalized nga pagtan-aw log kinahanglan nga:
    • Naglangkob sa tanan nga mga kolum gikan sa lamesa nga gi-refer sa materyal nga pagtan-aw.
    • Ipiho uban sa ROWID ug INCLUDING NEW VALUES.
    • Tinoa ang SEQUENCE clause kung ang lamesa gilauman nga adunay usa ka pagsagol sa mga pagsal-ot / direkta nga pagkarga, pagtangtang, ug pag-update.

  • lamang SUM, COUNT, AVG, STDDEV, VARIANCE, MIN ug MAX gisuportahan alang sa paspas nga pag-refresh.
  • COUNT(*) kinahanglan nga espesipiko.
  • Ang mga aggregate function kinahanglan mahitabo lamang isip pinakagawas nga bahin sa ekspresyon. Sa ato pa, mga aggregate sama sa AVG(AVG(x)) or AVG(x)+ AVG(x) dili gitugotan.
  • Alang sa matag aggregate sama sa AVG(expr), ang katugbang COUNT(expr) kinahanglan nga anaa. Girekomenda kini sa Oracle SUM(expr) ipiho.
  • If VARIANCE(expr) or STDDEV(expr) gitakda, COUNT(expr) ug SUM(expr) kinahanglan nga espesipiko. Girekomenda kini sa Oracle SUM(expr *expr) ipiho.
  • ang SELECT kolum sa defining query dili mahimong komplikado nga ekspresyon nga adunay mga column gikan sa daghang base table. Ang usa ka posible nga solusyon niini mao ang paggamit sa usa ka nested materialized view.
  • ang SELECT lista kinahanglan adunay tanan GROUP BY mga haligi.
  • Ang materyal nga pagtan-aw wala gibase sa usa o daghan pa nga hilit nga mga lamesa.
  • Kung mogamit ka a CHAR data type sa filter columns sa usa ka materialized view log, ang character sets sa master site ug ang materialized view kinahanglang magkaparehas.
  • Kung ang materyal nga pagtan-aw adunay usa sa mga musunud, nan ang paspas nga pag-refresh gisuportahan lamang sa naandan nga pagsal-ot sa DML ug direkta nga mga karga.
    • Materialized nga mga panglantaw uban sa MIN or MAX nagpundok
    • Materialized nga mga panglantaw nga adunay SUM(expr) apan dili COUNT(expr)
    • Materyalisar nga mga panan-aw nga wala COUNT(*)

    Ang ingon nga materyal nga pagtan-aw gitawag nga insert-only materialized view.

  • Usa ka materyal nga panglantaw uban sa MAX or MIN paspas nga ma-refresh pagkahuman matangtang o gisagol ang mga pahayag sa DML kung wala kini a WHERE clause.
    Ang max/min nga paspas nga pag-refresh human sa pagtangtang o sagol nga DML walay sama nga kinaiya sa insert-only case. Gitangtang niini ug gi-compute usab ang max/min nga mga kantidad alang sa mga apektadong grupo. Kinahanglan nga imong mahibal-an ang epekto sa performance niini.
  • Materyalisar nga mga panan-aw nga adunay gihinganlan nga mga panan-aw o mga subquery sa FROM Ang clause dali nga ma-refresh kung ang mga panan-aw mahimong hingpit nga mahiusa. Alang sa kasayuran kung unsang mga panan-aw ang maghiusa, tan-awa Oracle Database SQL Language Reference.
  • Kung walay mga gawas nga pagdugtong, mahimo kang adunay arbitraryong mga pagpili ug mga apil sa WHERE clause.
  • Ang materyalized nga aggregate nga mga panan-aw nga adunay gawas nga mga sumpay dali nga ma-refresh pagkahuman sa naandan nga DML ug direkta nga pagkarga, basta ang gawas nga lamesa ra ang giusab. Usab, ang talagsaon nga mga pagpugong kinahanglan nga anaa sa mga kolum sa pag-apil sa sulod nga lamesa sa pag-apil. Kung adunay mga gawas nga pagdugtong, ang tanan nga mga pagdugtong kinahanglan nga konektado sa ANDs ug kinahanglang gamiton ang pagkaparehas (=) operator.
  • Alang sa materyal nga mga panan-aw nga adunay CUBE, ROLLUP, paggrupo nga mga set, o paghugpong niini, ang mosunod nga mga pagdili magamit:
    • ang SELECT listahan kinahanglan nga adunay paggrupo nga distinguisher nga mahimo nga usa ka GROUPING_ID function sa tanan GROUP BY mga ekspresyon o GROUPING naglihok usa alang sa matag usa GROUP BY ekspresyon. Pananglitan, kon ang GROUP BY clause sa materialized nga panglantaw mao ang "GROUP BY CUBE(a, b)", unya ang SELECT lista kinahanglan nga adunay "GROUPING_ID(a, b)" o "GROUPING(a) AND GROUPING(b)» aron ang materyal nga pagtan-aw dali nga ma-refresh.
    • GROUP BY dili kinahanglan nga moresulta sa bisan unsang duplicate nga mga grupo. Pananglitan, "GROUP BY a, ROLLUP(a, b)" dili paspas nga ma-refresh tungod kay moresulta kini sa mga duplicate nga grupo "(a), (a, b), AND (a)".

5.3.8.7 Mga Pagdili sa Fast Refresh sa Materialized Views sa UNION ALL

Materialized nga mga panglantaw uban sa UNION ALL set operator suporta sa REFRESH FAST opsyon kon ang mosunod nga mga kondisyon matagbaw:

  • Ang paghubit nga pangutana kinahanglan adunay UNION ALL operator sa taas nga lebel.

    ang UNION ALL Ang operator dili mahimong i-embed sa sulod sa usa ka subquery, nga adunay usa ka eksepsiyon: Ang UNION ALL mahimong sa usa ka subquery sa FROM clause nga gihatag ang defining query sa porma SELECT * FROM (pagtan-aw o subquery uban sa UNION ALL) sama sa mosunod nga pananglitan:

    PAGHIMO VIEW view_with_unionall AS (SELECT c.rowid crid, c.cust_id, 2 umarker GIKAN sa mga kustomer c WHERE c.cust_last_name = 'Smith' UNION ALL SELECT c.rowid crid, c.cust_id, 3 umarker GIKAN sa mga kustomer c WHERE c.cust_last_name 'Jones'); PAGHIMO MATERIALIZED VIEW unionall_inside_view_mv REFRESH FAST ON DEMAND AS PILI * GIKAN sa view_with_unionall;
    

    Timan-i nga ang panglantaw view_with_unionall nagtagbaw sa mga kinahanglanon alang sa paspas nga pag-refresh.

  • Ang matag bloke sa pangutana sa UNION ALL Ang pangutana kinahanglan nga makatagbaw sa mga kinahanglanon sa usa ka paspas nga refreshable materialized view nga adunay mga aggregates o usa ka paspas nga refreshable materialized view nga adunay mga sumpay.

    Ang angay nga materyalized nga talan-awon sa talan-awon kinahanglan nga himoon sa mga lamesa ingon nga gikinahanglan alang sa katugbang nga matang sa paspas refreshable materialized panglantaw.
    Timan-i nga ang Oracle Database nagtugot usab sa espesyal nga kaso sa usa ka lamesa nga materialized nga pagtan-aw nga adunay mga sumpay nga gihatag lamang sa ROWID kolum gilakip sa SELECT listahan ug sa materialized view log. Kini gipakita sa defining query sa view view_with_unionall.

  • ang SELECT lista sa matag pangutana kinahanglang maglakip sa a UNION ALL marker, ug ang UNION ALL Ang kolum kinahanglan adunay usa ka lahi nga kanunay nga numero o string nga kantidad sa matag usa UNION ALL sanga. Dugang pa, ang kolum sa marker kinahanglan nga makita sa parehas nga posisyon sa ordinal sa SELECT listahan sa matag block sa pangutana. Tan-awa"UNION ALL Marker ug Query Rewrite» alang sa dugang nga impormasyon mahitungod sa UNION ALL mga marka
  • Ang ubang mga feature sama sa outer joins, insert-only aggregate materialized view query ug remote tables dili suportado para sa materialized view with UNION ALL. Matikdi, bisan pa niana, nga ang materyal nga mga panan-aw nga gigamit sa pagkopya, nga walay mga sumpay o mga aggregate, mahimong paspas nga ma-refresh kung UNION ALL o hilit nga mga lamesa gigamit.
  • Ang compatibility initialization parameter kinahanglang itakda sa 9.2.0 o mas taas aron makamugna og paspas nga refreshable materialized view nga adunay UNION ALL.

Dili ko gusto nga makapasilo sa mga fans sa Oracle, apan sa paghukom sa ilang listahan sa mga pagdili, kini nga mekanismo daw gisulat dili sa kinatibuk-ang kaso, gamit ang usa ka matang sa modelo, apan sa liboan ka mga Indian, diin ang tanan gihatagan og oportunidad sa pagsulat sa ilang kaugalingon nga sanga, ug ang matag usa kanila nagbuhat kutob sa iyang mahimo. Ang paggamit niini nga mekanismo alang sa tinuod nga lohika sama sa paglakaw sa usa ka minahan. Makakuha ka og minahan bisan unsang orasa pinaagi sa pag-igo sa usa sa dili klaro nga mga pagdili. Giunsa kini pagtrabaho usa usab ka bulag nga pangutana, apan lapas kini sa sulud sa kini nga artikulo.

Microsoft SQL Server

Dugang nga mga Kinahanglanon

Dugang pa sa mga kapilian sa SET ug mga kinahanglanon sa pag-andar nga deterministiko, ang mga mosunod nga kinahanglanon kinahanglan matuman:

  • Ang tiggamit nga nagpatuman CREATE INDEX kinahanglan nga tag-iya sa pagtan-aw.
  • Kung maghimo ka sa indeks, ang IGNORE_DUP_KEY ang opsyon kinahanglang itakda sa OFF (ang default setting).
  • Ang mga lamesa kinahanglan nga i-refer sa duha ka bahin nga mga ngalan, scheme.ngalan sa lamesa sa kahulugan sa pagtan-aw.
  • Ang mga function nga gitakda sa user nga gi-refer sa view kinahanglang himoon pinaagi sa paggamit sa WITH SCHEMABINDING kapilian.
  • Ang bisan unsang mga function nga gitakda sa user nga gi-refer sa view kinahanglan nga i-reference sa duha ka bahin nga mga ngalan, ..
  • Ang data access property sa usa ka user-defined function kinahanglan nga NO SQL, ug ang external access property kinahanglan NO.
  • Ang kasagarang mga function sa runtime sa pinulongan (CLR) mahimong makita sa pinili nga listahan sa panglantaw, apan dili mahimong bahin sa kahulugan sa clustered index key. Ang mga function sa CLR dili makita sa WHERE clause sa view o sa ON clause sa usa ka JOIN nga operasyon sa view.
  • Ang CLR function ug mga pamaagi sa CLR user-defined type nga gigamit sa view definition kinahanglang adunay mga property set sama sa gipakita sa mosunod nga table.

    Property
    Mubo nga sulat

    DETERMINISTIC = TINUOD
    Kinahanglang klaro nga ipahayag isip usa ka kinaiya sa Microsoft .NET Framework nga pamaagi.

    PEKSIYO = TINUOD
    Kinahanglan nga klaro nga ipahayag ingon usa ka kinaiya sa .NET Framework nga pamaagi.

    DATA ACCESS = WALAY SQL
    Determinado pinaagi sa pagbutang sa DataAccess attribute sa DataAccessKind.None ug SystemDataAccess attribute sa SystemDataAccessKind.None.

    EXTERNAL ACCESS = DILI
    Kini nga kabtangan nag-default sa NO para sa CLR rutina.

  • Ang panglantaw kinahanglang himoon pinaagi sa paggamit sa WITH SCHEMABINDING kapilian.
  • Ang pagtan-aw kinahanglan nga maghisgot lamang sa mga base nga lamesa nga anaa sa sama nga database sa panglantaw. Ang talan-awon dili makahisgot sa ubang mga panglantaw.
  • Ang PILI nga pahayag sa depinisyon sa pagtan-aw kinahanglan dili maglangkob sa mosunod nga mga elemento sa Transact-SQL:

    COUNT
    Mga gimbuhaton sa ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, UG OPENXML)
    OUTER miapil(LEFT, RIGHT, o FULL)

    Nakuha nga lamesa (gihubit pinaagi sa pagtino sa a SELECT pahayag sa FROM clause)
    Pag-apil sa kaugalingon
    Pagtino sa mga kolum pinaagi sa paggamit SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, o AVG
    Common table expression (CTE)

    naglutaw1, teksto, ntext, larawan, XML, o filestream mga haligi
    Subquery
    OVER clause, nga naglakip sa ranggo o aggregate nga mga function sa bintana

    Full-text nga predicates (CONTAINS, FREETEXT)
    SUM function nga nagtumong sa usa ka nullable nga ekspresyon
    ORDER BY

    CLR user-defined aggregate function
    TOP
    CUBE, ROLLUP, o GROUPING SETS Mga operator

    MIN, MAX
    UNION, EXCEPT, o INTERSECT Mga operator
    TABLESAMPLE

    Mga variable sa lamesa
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Pigti nga mga set sa kolum
    Inline (TVF) o multi-statement table-valued functions (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 Ang na-index nga pagtan-aw mahimong adunay sulod naglutaw mga kolum; bisan pa, ang ingon nga mga kolum dili maapil sa clustered index key.

  • If GROUP BY anaa, ang VIEW kahulugan kinahanglan adunay sulod COUNT_BIG(*) ug kinahanglan dili maglangkob HAVING. Kini GROUP BY Ang mga pagdili magamit lamang sa gi-index nga kahulugan sa pagtan-aw. Ang usa ka pangutana makagamit ug indexed view sa iyang execution plan bisan kung kini dili makatagbaw niini GROUP BY pagdili.
  • Kung ang kahulugan sa pagtan-aw naglangkob sa a GROUP BY clause, ang yawe sa talagsaon nga clustered index mahimong maghisgot lamang sa mga kolum nga gipiho sa GROUP BY clause.

Tin-aw dinhi nga ang mga Indian wala maapil, tungod kay nakahukom sila sa pagbuhat niini sumala sa laraw nga “gamay ra ang among buhaton, apan maayo.” Sa ato pa, mas daghan silag minahan sa field, pero mas transparent ang ilang lokasyon. Ang labing makapahigawad nga butang mao kini nga limitasyon:

Ang pagtan-aw kinahanglan nga maghisgot lamang sa mga base nga lamesa nga anaa sa sama nga database sa panglantaw. Ang talan-awon dili makahisgot sa ubang mga panglantaw.

Sa among terminolohiya, kini nagpasabot nga ang usa ka function dili maka-access sa laing materialized function. Giputol niini ang tanang ideolohiya sa sinugdanan.
Usab, kini nga limitasyon (ug dugang pa sa teksto) makapakunhod pag-ayo sa mga kaso sa paggamit:

Ang PILI nga pahayag sa depinisyon sa pagtan-aw kinahanglan dili maglangkob sa mosunod nga mga elemento sa Transact-SQL:

COUNT
Mga gimbuhaton sa ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, UG OPENXML)
OUTER miapil(LEFT, RIGHT, o FULL)

Nakuha nga lamesa (gihubit pinaagi sa pagtino sa a SELECT pahayag sa FROM clause)
Pag-apil sa kaugalingon
Pagtino sa mga kolum pinaagi sa paggamit SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, o AVG
Common table expression (CTE)

naglutaw1, teksto, ntext, larawan, XML, o filestream mga haligi
Subquery
OVER clause, nga naglakip sa ranggo o aggregate nga mga function sa bintana

Full-text nga predicates (CONTAINS, FREETEXT)
SUM function nga nagtumong sa usa ka nullable nga ekspresyon
ORDER BY

CLR user-defined aggregate function
TOP
CUBE, ROLLUP, o GROUPING SETS Mga operator

MIN, MAX
UNION, EXCEPT, o INTERSECT Mga operator
TABLESAMPLE

Mga variable sa lamesa
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Pigti nga mga set sa kolum
Inline (TVF) o multi-statement table-valued functions (MSTVF)
OFFSET

CHECKSUM_AGG

Ang OUTER JOINS, UNION, ORDER BY ug uban pa gidili. Mahimo nga mas sayon ​​​​ang pagtino kung unsa ang magamit kaysa kung unsa ang dili magamit. Ang listahan lagmit mas mubo.

Sa pag-summarize: usa ka dako nga hugpong sa mga pagdili sa matag (atong timan-an ang komersyal) DBMS vs wala (gawas sa usa ka lohikal, dili teknikal) sa teknolohiya sa LGPL. Bisan pa, kinahanglan nga matikdan nga ang pagpatuman niini nga mekanismo sa relational logic medyo mas lisud kaysa sa gihulagway nga functional logic.

Pagpatuman

Giunsa kini paglihok? Ang PostgreSQL gigamit isip usa ka "virtual machine". Adunay usa ka komplikado nga algorithm sa sulod nga nagtukod mga pangutana. Dinhi gigikanan. Ug dili lang usa ka dako nga hugpong sa heuristics nga adunay usa ka hugpong sa mga ifs. Mao nga, kung adunay ka pipila ka bulan aron magtuon, mahimo nimong sulayan nga masabtan ang arkitektura.

Epektibo ba kini? Epektibo kaayo. Ikasubo, kini lisud pamatud-an. Makaingon lang ko nga kung imong hunahunaon ang libu-libo nga mga pangutana nga anaa sa dagkong mga aplikasyon, nan sa kasagaran mas episyente sila kaysa sa usa ka maayo nga developer. Ang usa ka maayo kaayo nga SQL programmer makahimo sa pagsulat sa bisan unsang pangutana nga mas episyente, apan sa usa ka libo nga mga pangutana wala siyay kadasig o panahon sa pagbuhat niini. Ang bugtong butang nga akong masulti karon isip pamatuod sa pagkaepektibo mao nga daghang mga proyekto ang nagtrabaho sa plataporma nga gitukod sa kini nga DBMS Mga sistema sa ERP, nga adunay libu-libo nga lainlaing MATERIALIZED nga mga gimbuhaton, nga adunay libu-libo nga mga tiggamit ug terabyte nga mga database nga adunay gatusan ka milyon nga mga rekord nga nagdagan sa usa ka regular nga server sa duha ka processor. Bisan pa, bisan kinsa ang makasusi/makapanghimakak sa pagkaepektibo pinaagi sa pag-download plataporma ug PostgreSQL, nag-on pag-log sa mga pangutana sa SQL ug pagsulay sa pag-usab sa lohika ug datos didto.

Sa sunod nga mga artikulo, maghisgot usab ako kung giunsa nimo pagtakda ang mga pagdili sa mga gimbuhaton, pagtrabaho sa mga sesyon sa pagbag-o, ug daghan pa.

Source: www.habr.com

Idugang sa usa ka comment