Balanse ekri ak lekti nan yon baz done

Balanse ekri ak lekti nan yon baz done
Nan anvan an Atik Mwen dekri konsèp ak aplikasyon yon baz done bati sou baz fonksyon, olye ke tab ak jaden tankou nan baz done relasyon. Li te bay anpil egzanp ki montre avantaj ki genyen nan apwòch sa a sou youn nan klasik. Anpil jwenn yo pa konvenk ase.

Nan atik sa a, mwen pral montre kouman konsèp sa a pèmèt ou byen vit ak fasil balans ekri ak li nan baz done a san okenn chanjman nan lojik nan fonksyone. Fonksyonalite menm jan an te eseye aplike nan DBMS komèsyal modèn (an patikilye, Oracle ak Microsoft SQL sèvè). Nan fen atik la mwen pral montre ke sa yo te fè, pou mete l 'dous, pa te mache byen.

Deskripsyon

Kòm anvan, pou pi byen konprann mwen pral kòmanse deskripsyon an ak egzanp. Ann di nou bezwen aplike lojik ki pral retounen yon lis depatman ak kantite anplwaye yo nan yo ak salè total yo.

Nan yon baz done fonksyonèl li ta sanble sa a:

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

Konpleksite nan egzekite rechèch sa a nan nenpòt DBMS pral ekivalan a O (kantite anplwaye)paske kalkil sa a mande pou eskane tout tab anplwaye yo epi answit gwoupe yo pa depatman. Ap genyen tou kèk ti siplemantè (nou kwè ke gen anpil plis anplwaye pase depatman) depann sou plan yo chwazi a. O (jounal kantite anplwaye yo) oswa O (kantite depatman) pou gwoupman ak sou sa.

Li klè ke sou tèt ekzekisyon an ka diferan nan DBMS diferan, men konpleksite a pa pral chanje nan okenn fason.

Nan aplikasyon yo pwopoze a, DBMS fonksyonèl yo pral jenere yon sèl sous-rekèt ki pral kalkile valè yo mande pou depatman an, ak Lè sa a, fè yon JOIN ak tab depatman an pou jwenn non an. Sepandan, pou chak fonksyon, lè yo deklare, li posib pou mete yon makè espesyal MATERIALIZED. Sistèm nan pral otomatikman kreye yon jaden korespondan pou chak fonksyon sa yo. Lè w ap chanje valè yon fonksyon, valè jaden an ap chanje tou nan menm tranzaksyon an. Lè w gen aksè nan fonksyon sa a, yo pral jwenn aksè nan jaden an pre-kalkile.

An patikilye, si ou mete MATERIALIZED pou fonksyon konteAnplwaye и salarySum, Lè sa a, de jaden yo pral ajoute nan tablo a ak lis depatman yo, ki pral estoke kantite anplwaye yo ak salè total yo. Chak fwa gen yon chanjman nan anplwaye yo, salè yo oswa afilyasyon depatman yo, sistèm nan pral otomatikman chanje valè yo nan jaden sa yo. Rekèt ki anwo a pral jwenn aksè nan jaden sa yo dirèkteman epi yo pral egzekite nan O (kantite depatman).

Ki restriksyon yo? Sèlman yon sèl bagay: yon fonksyon konsa dwe gen yon kantite fini nan valè D 'pou ki valè li yo defini. Sinon, li pral enposib bati yon tab ki estoke tout valè li yo, paske pa ka gen yon tab ki gen yon kantite enfini nan ranje.

Egzanp:

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

Fonksyon sa a defini pou yon kantite enfini nan valè N (pa egzanp, nenpòt valè negatif apwopriye). Se poutèt sa, ou pa ka mete MATERIALIZED sou li. Se konsa, sa a se yon limitasyon lojik, pa yon yon sèl teknik (ki se, pa paske nou pa t 'kapab aplike li). Sinon, pa gen okenn restriksyon. Ou ka itilize gwoupman, klasman, AK ak OSWA, PARTITION, rekursion, elatriye.

Pou egzanp, nan pwoblèm 2.2 nan atik anvan an, ou ka mete MATERIALIZED sou tou de fonksyon:

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;

Sistèm nan tèt li pral kreye yon tab ak kalite kle Kliyan, pwodwi и NONTGE, pral ajoute de jaden nan li epi li pral mete ajou valè jaden yo nan yo ak nenpòt chanjman. Lè yo fè plis apèl nan fonksyon sa yo, yo pa pral kalkile, men pito valè yo pral li nan jaden korespondan yo.

Sèvi ak mekanis sa a, ou ka, pou egzanp, debarase m de recursions (CTE) nan demann. An patikilye, konsidere gwoup ki fòme yon pye bwa lè l sèvi avèk relasyon timoun/paran (chak gwoup gen yon lyen ak paran li):

parent = DATA Group (Group);

Nan yon baz done fonksyonèl, lojik repetisyon ka espesifye jan sa a:

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;

Depi pou fonksyon an isParent se make MATERIALIZED, Lè sa a, yon tab ak de kle (gwoup) pral kreye pou li, nan ki jaden an isParent pral vre sèlman si premye kle a se yon pitit dezyèm lan. Kantite antre nan tablo sa a pral egal a kantite gwoup miltipliye pa pwofondè mwayèn pye bwa a. Si ou bezwen, pou egzanp, konte kantite pitit pitit yon sèten gwoup, ou ka itilize fonksyon sa a:

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

Pa pral gen okenn CTE nan rechèch la SQL. Olye de sa pral gen yon senp GROUP BY.

Sèvi ak mekanis sa a, ou ka fasilman denormalize baz done a si sa nesesè:

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

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

Lè w ap rele yon fonksyon dat pou liy lòd la, yo pral li jaden an pou ki gen yon endèks nan tablo ki gen liy lòd. Lè dat lòd la chanje, sistèm nan tèt li pral otomatikman rekalkile dat denormalize nan liy lan.

Avantaj

Pou kisa tout mekanis sa a ye? Nan DBMS klasik yo, san yo pa reekri demann, yon pwomotè oswa DBA ka sèlman chanje endèks, detèmine estatistik epi di planifikatè rechèch la ki jan yo egzekite yo (ak KONSÈY yo disponib sèlman nan DBMS komèsyal yo). Nenpòt kòman di yo eseye, yo p'ap ka ranpli premye requête nan atik nan O (kantite depatman) san yo pa chanje demann oswa ajoute deklanche. Nan konplo yo pwopoze a, nan etap devlopman ou pa bezwen reflechi sou estrikti depo done a ak ki agrégasyon pou itilize. Tout bagay sa a ka fasil chanje sou vole a, dirèkteman nan operasyon.

Nan pratik li sanble sa a. Gen kèk moun ki devlope lojik dirèkteman ki baze sou travay la nan men yo. Yo pa konprann algoritm ak konpleksite yo, ni plan ekzekisyon, ni kalite rantre, ni okenn lòt eleman teknik. Moun sa yo se plis analis biznis pase devlopè. Lè sa a, tout bagay sa yo ale nan tès oswa operasyon. Pèmèt antre nan demann ki dire lontan. Lè yon rechèch long detekte, Lè sa a, lòt moun (plis teknik - esansyèlman DBA) deside pèmèt MATERIALIZED sou kèk fonksyon entèmedyè. Sa a ralanti anrejistreman an yon ti kras (depi li mande pou mete ajou yon jaden anplis nan tranzaksyon an). Sepandan, se pa sèlman rechèch sa a siyifikativman akselere, men tou, tout lòt moun ki sèvi ak fonksyon sa a. An menm tan an, deside ki fonksyon pou konkretize relativman fasil. De paramèt prensipal: kantite valè opinyon posib (sa a se konbyen dosye yo pral nan tablo ki koresponn lan), ak konbyen fwa yo itilize li nan lòt fonksyon.

Analogue

DBMS komèsyal modèn yo gen mekanis menm jan an: MATERIALIZED VIEW ak FAST REFRESH (Oracle) ak INDEXED VIEW (Microsoft SQL Server). Nan PostgreSQL, MATERIALIZED VIEW pa ka mete ajou nan yon tranzaksyon, men sèlman sou demann (e menm ak restriksyon trè strik), kidonk nou pa konsidere li. Men, yo gen plizyè pwoblèm ki limite anpil itilizasyon yo.

Premyèman, ou ka sèlman pèmèt materyalizasyon si ou te deja kreye yon VIEW regilye. Sinon, w ap oblije reekri demann ki rete yo pou jwenn aksè nan vi ki fèk kreye pou itilize materyalizasyon sa a. Oswa kite tout bagay jan li ye, men li pral omwen inefikas si gen sèten done deja pre-kalkile, men anpil demann pa toujou sèvi ak li, men rekalkile li.

Dezyèmman, yo gen yon gwo kantite restriksyon:

Oracle

5.3.8.4 Restriksyon jeneral sou rafrechisman rapid

Rekèt la defini nan View materyalize a gen restriksyon jan sa a:

  • View materyalize a pa dwe genyen referans a ekspresyon ki pa repete tankou SYSDATE ak ROWNUM.
  • View materyalize a pa dwe genyen referans a RAW or LONG RAW kalite done yo.
  • Li pa ka genyen yon SELECT lis subrequest.
  • Li pa kapab genyen fonksyon analyse (pa egzanp, RANK) nan SELECT kloz.
  • Li pa ka fè referans a yon tab kote yon XMLIndex endèks defini.
  • Li pa ka genyen yon MODEL kloz.
  • Li pa ka genyen yon HAVING kloz ak yon subquery.
  • Li pa kapab genyen requêtes imbriqués ki genyen ANY, ALL, Oswa NOT EXISTS.
  • Li pa ka genyen yon [START WITH …] CONNECT BY kloz.
  • Li pa kapab genyen plizyè tab detay nan diferan sit.
  • ON COMMIT opinyon konkretize pa ka gen tab detay aleka.
  • Opinyon materyalize anbrike yo dwe gen yon rantre oswa yon total.
  • Materyalize opinyon ansanm ak materyalize opinyon total ak yon GROUP BY kloz pa ka chwazi nan yon tablo endèks òganize.

5.3.8.5 Restriksyon sou rafrechisman rapid sou vi materyalize ak rantre sèlman

Definisyon demann pou opinyon materyalize ak rantre sèlman epi pa gen total, gen restriksyon sa yo sou rafrechi rapid:

  • Tout restriksyon soti nan «Restriksyon jeneral sou rafrechi rapid".
  • Yo pa ka genyen GROUP BY kloz oswa total.
  • Ranje nan tout tab yo nan la FROM lis dwe parèt nan la SELECT lis rechèch la.
  • Jounal materyalize View dwe egziste ak rowids pou tout tab yo baz nan la FROM lis rechèch la.
  • Ou pa kapab kreye yon vi materyalize rapid rafrechib soti nan tab miltip ak rantre senp ki gen ladann yon kolòn kalite objè nan la. SELECT deklarasyon.

Epitou, metòd rafrechisman ou chwazi a pa pral pi efikas si:

  • Rekèt la defini itilize yon rantre deyò ki konpòte li tankou yon rantre anndan. Si rekèt definisyon an gen yon rantre konsa, konsidere reekri rekèt definisyon an pou genyen yon rantre anndan an.
  • Jounal SELECT lis vi materyalize a gen ekspresyon sou kolòn ki soti nan plizyè tab.

5.3.8.6 Restriksyon sou rafrechisman rapid sou vi materyalize ak total

Defini demann pou opinyon materyalize ak total oswa rantre gen restriksyon sa yo sou rafrechi rapid:

Rafrechi rapid yo sipòte pou tou de ON COMMIT ak ON DEMAND opinyon konkretize, sepandan restriksyon sa yo aplike:

  • Tout tab ki nan vi materyalize yo dwe gen mòso mòso vizyon materyalize, epi mòso mòso vizyon materyalize yo dwe:
    • Genyen tout kolòn ki soti nan tablo ki refere yo nan View materyalize a.
    • Espesifye ak ROWID ak INCLUDING NEW VALUES.
    • espesifye nan SEQUENCE kloz si tab la espere gen yon melanj de foure/chaj dirèk, efase, ak mizajou.

  • Se sèlman SUM, COUNT, AVG, STDDEV, VARIANCE, MIN ak MAX yo sipòte pou rafrechi rapid.
  • COUNT(*) dwe espesifye.
  • Fonksyon total yo dwe fèt sèlman kòm pati ekstèn ekspresyon an. Sa vle di, total tankou AVG(AVG(x)) or AVG(x)+ AVG(x) yo pa gen dwa.
  • Pou chak total tankou AVG(expr), korespondan an COUNT(expr) dwe prezan. Oracle rekòmande sa SUM(expr) dwe espesifye.
  • If VARIANCE(expr) or STDDEV(expr) espesifye, COUNT(expr) ak SUM(expr) dwe espesifye. Oracle rekòmande sa SUM(expr *expr) dwe espesifye.
  • Jounal SELECT kolòn nan rechèch la defini pa kapab yon ekspresyon konplèks ak kolòn ki soti nan plizyè tab baz. Yon solisyon posib nan sa a se sèvi ak yon vi materyalize imbrike.
  • Jounal SELECT lis dwe genyen tout GROUP BY kolòn.
  • Vi materyalize a pa baze sou youn oswa plis tab aleka.
  • Si ou itilize yon CHAR Kalite done nan kolòn yo filtre nan yon boutèy demi lit View materyalize, seri karaktè yo nan sit la mèt ak View nan materyalize yo dwe menm bagay la.
  • Si vi materyalize a gen youn nan bagay sa yo, Lè sa a, rafrechisman rapid sipòte sèlman sou foure DML konvansyonèl ak chaj dirèk.
    • Materyalize opinyon ak MIN or MAX granula
    • Materyalize opinyon ki gen SUM(expr) men non COUNT(expr)
    • Materyalize opinyon san yo pa COUNT(*)

    Yon vi materyalize sa yo rele yon vi materyalize insert-sèlman.

  • Yon vi materyalize ak MAX or MIN se rapid rafrechib apre efase oswa melanje deklarasyon DML si li pa gen yon WHERE kloz.
    Max/min rafrechisman rapid apre efase oswa melanje DML pa gen menm konpòtman ak ka insert-sèlman an. Li efase ak rekalkule valè max/min pou gwoup ki afekte yo. Ou bezwen konsyan de enpak pèfòmans li yo.
  • Opinyon materyalize ak opinyon nonmen oswa subqueries nan la FROM kloz ka byen vit rafrechi bay opinyon yo ka konplètman fizyone. Pou enfòmasyon sou ki opinyon yo pral rantre, gade Oracle Database SQL Referans Lang.
  • Si pa gen okenn rantre deyò, ou ka gen seleksyon abitrè ak rantre nan WHERE kloz.
  • Vizyon total materyalize ak rantre deyò yo rapid rafrechib apre DML konvansyonèl ak chaj dirèk, bay sèlman tab deyò a te modifye. Epitou, kontrent inik dwe egziste sou kolòn yo rantre nan tab la rantre anndan an. Si gen rantre deyò, tout rantre yo dwe konekte pa ANDs epi yo dwe itilize egalite a (=) operatè.
  • Pou materyalize opinyon ak CUBE, ROLLUP, gwoupman ansanm, oswa konkatènasyon yo, restriksyon sa yo aplike:
    • Jounal SELECT lis ta dwe genyen gwoup distenksyon ki ka swa a GROUPING_ID fonksyon sou tout GROUP BY ekspresyon oswa GROUPING fonksyon youn pou chak GROUP BY ekspresyon. Pou egzanp, si la GROUP BY kloz nan vi an konkretize se "GROUP BY CUBE(a, b)", Lè sa a, la SELECT lis ta dwe genyen swa "GROUPING_ID(a, b)» oswa «GROUPING(a) AND GROUPING(b)» pou vi a konkretize yo dwe vit rafrechib.
    • GROUP BY pa ta dwe lakòz okenn gwoupman kopi. Pa egzanp, "GROUP BY a, ROLLUP(a, b)" se pa rafrechib rapid paske li lakòz gwoupman kopi "(a), (a, b), AND (a)".

5.3.8.7 Restriksyon sou rafrechi rapid sou vi materyalize ak UNION ALL

Opinyon materyalize ak la UNION ALL mete sipò operatè a REFRESH FAST opsyon si kondisyon sa yo satisfè:

  • Rekèt la defini dwe genyen UNION ALL operatè nan nivo siperyè.

    Jounal UNION ALL operatè pa ka entegre andedan yon subquery, ak yon sèl eksepsyon: The UNION ALL ka nan yon subquery nan la FROM kloz bay demann lan defini se nan fòm lan SELECT * FROM (wè oswa subquery ak UNION ALL) tankou nan egzanp sa a:

    CREATE VIEW view_with_unionall AS (SELECT c.rowid crid, c.cust_id, 2 umarker FROM kliyan c WHERE c.cust_last_name = 'Smith' UNION TOUT CHWAZI c.rowid crid, c.cust_id, 3 umarker FROM kliyan c WHERE c.cust_last_name 'Jones'); KREYE MATERIALIZED VIEW unionall_inside_view_mv RAPIDE RAPID SOU DEMAND KÒM SELECT * FROM view_with_unionall;
    

    Remake byen ke vi a view_with_unionall satisfè kondisyon yo pou rafrechi rapid.

  • Chak blòk rechèch nan la UNION ALL rechèch dwe satisfè egzijans yo nan yon vi rapid refreshable konkretize ak total oswa yon vi rapid refreshable konkretize ak rantre.

    Yo dwe kreye mòso bwa ki apwopriye pou wè materyalize sou tab yo jan sa nesesè pou kalite korespondan vi materyalize rapid rafrechib.
    Remake byen ke baz done a Oracle pèmèt tou ka espesyal nan yon tab sèl materyalize View ak rantre sèlman bay la ROWID kolòn te enkli nan la SELECT lis ak nan jounal la vi materyalize. Sa a montre nan rechèch la defini nan gade nan view_with_unionall.

  • Jounal SELECT lis chak demann dwe gen ladan yon UNION ALL makè, ak la UNION ALL kolòn dwe genyen yon valè konstan nimerik oswa yon chèn nan chak UNION ALL branch. Anplis de sa, kolòn makè a dwe parèt nan menm pozisyon ordinal nan SELECT lis chak blòk rechèch. Gade "UNION ALL Marker ak Reekri Rekèt» pou plis enfòmasyon konsènan UNION ALL makè.
  • Gen kèk karakteristik tankou rejyon ekstèn, rekèt vi materyalize total insert-sèlman ak tab aleka yo pa sipòte pou opinyon materyalize ak UNION ALL. Remake, sepandan, ke pwen de vi materyalize yo itilize nan replikasyon, ki pa genyen rantre oswa total, ka rapid rafrechi lè UNION ALL oswa tab aleka yo itilize.
  • Paramèt inisyalizasyon konpatibilite a dwe mete sou 9.2.0 oswa pi wo pou kreye yon vi materyalize rapid rafrechib ak UNION ALL.

Mwen pa vle ofanse fanatik Oracle, men jije pa lis restriksyon yo, li sanble ke mekanis sa a te ekri pa nan ka jeneral la, lè l sèvi avèk kèk kalite modèl, men pa plizyè milye Endyen, kote tout moun te bay opòtinite pou yo. ekri pwòp branch pa yo, epi chak nan yo te fè sa li te kapab. Sèvi ak mekanis sa a pou lojik reyèl, se tankou mache nan yon jaden min. Ou ka jwenn yon min nenpòt ki lè pa frape youn nan restriksyon ki pa evidan. Ki jan li fonksyone se tou yon kesyon separe, men li depase sijè ki abòde lan atik sa a.

Microsoft SQL sèvè

Kondisyon Lòt

Anplis opsyon SET ak kondisyon fonksyon detèminist yo, kondisyon sa yo dwe ranpli:

  • Itilizatè a ki egzekite CREATE INDEX dwe pwopriyetè vi a.
  • Lè ou kreye endèks la, la IGNORE_DUP_KEY opsyon dwe mete nan OFF (anviwònman default la).
  • Tablo yo dwe fè referans ak non de pati, konplo.tablename nan definisyon an vi.
  • Fonksyon ki defini itilizatè yo fè referans nan vi a dwe kreye lè l sèvi avèk la WITH SCHEMABINDING opsyon.
  • Nenpòt fonksyon defini itilizatè yo fè referans nan vi a dwe referans pa non de pati, ..
  • Pwopriyete aksè a done nan yon fonksyon itilizatè-defini dwe NO SQL, ak pwopriyete aksè ekstèn dwe NO.
  • Fonksyon Common Language Runtime (CLR) ka parèt nan lis la chwazi nan vi a, men yo pa kapab fè pati definisyon kle endèks gwoup la. Fonksyon CLR pa ka parèt nan kloz WHERE nan vi a oswa kloz ON nan yon operasyon JOIN nan vi a.
  • Fonksyon CLR ak metòd kalite CLR defini itilizatè yo itilize nan definisyon vi a dwe genyen pwopriyete yo mete jan yo montre nan tablo ki anba la a.

    pwopriyete
    nòt

    DETERMINISTIC = VRE
    Ou dwe deklare klèman kòm yon atribi metòd Microsoft .NET Framework.

    PREZI = VRE
    Ou dwe deklare klèman kòm yon atribi metòd .NET Framework.

    AKSÈ DONE = PA SQL
    Detèmine lè w mete atribi DataAccess nan DataAccessKind.None ak atribi SystemDataAccess nan SystemDataAccessKind.None.

    Aksè ekstèn = NON
    Pwopriyete sa a pa default nan NON pou woutin CLR.

  • View la dwe kreye lè l sèvi avèk la WITH SCHEMABINDING opsyon.
  • View la dwe fè referans sèlman tab baz ki nan menm baz done ak gade nan. View a pa ka fè referans ak lòt opinyon.
  • Deklarasyon SELECT nan definisyon gade pa dwe genyen eleman Transact-SQL sa yo:

    COUNT
    Fonksyon ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, AK OPENXML)
    OUTER rantre nan(LEFT, RIGHT, Oswa FULL)

    Tablo ki sòti (ki defini lè w espesifye a SELECT deklarasyon nan la FROM kloz)
    Self-join
    Espesifye kolòn lè l sèvi avèk SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, Oswa AVG
    Ekspresyon tab komen (CTE)

    flote1, tèks, ntèks, imaj, XML, Oswa filestream kolòn
    subquery
    OVER kloz, ki gen ladan fonksyon fenèt klasman oswa total

    Predikatè tèks konplè (CONTAINS, FREETEXT)
    SUM fonksyon ki fè referans a yon ekspresyon nullable
    ORDER BY

    CLR itilizatè-defini fonksyon total
    TOP
    CUBE, ROLLUP, Oswa GROUPING SETS Operatè

    MIN, MAX
    UNION, EXCEPT, Oswa INTERSECT Operatè
    TABLESAMPLE

    Tablo varyab
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Ansanm kolòn ra
    Inline (TVF) oswa fonksyon milti-deklarasyon tab-valed functions (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 View endis la ka genyen flote kolòn; sepandan, kolòn sa yo pa ka enkli nan kle endèks gwoup la.

  • If GROUP BY prezan, definisyon an VIEW dwe genyen COUNT_BIG(*) epi yo pa dwe genyen HAVING. sa yo GROUP BY restriksyon yo aplikab sèlman nan definisyon endis la. Yon rechèch ka itilize yon View endis nan plan ekzekisyon li menm si li pa satisfè sa yo GROUP BY restriksyon.
  • Si definisyon vi a genyen yon GROUP BY kloz, kle a nan endèks la gwoup inik ka fè referans sèlman kolòn yo espesifye nan la GROUP BY kloz.

Li klè isit la ke Endyen yo pa t patisipe, paske yo te deside fè li dapre konplo a "nou pral fè ti kras, men byen." Sa vle di, yo gen plis min sou teren an, men kote yo pi transparan. Bagay ki pi enèvan se limit sa a:

View la dwe fè referans sèlman tab baz ki nan menm baz done ak gade nan. View a pa ka fè referans ak lòt opinyon.

Nan tèminoloji nou an, sa vle di ke yon fonksyon pa ka jwenn aksè nan yon lòt fonksyon konkretize. Sa a koupe tout ideoloji nan boujon an.
Epitou, limit sa a (ak plis nan tèks la) redwi anpil ka itilize yo:

Deklarasyon SELECT nan definisyon gade pa dwe genyen eleman Transact-SQL sa yo:

COUNT
Fonksyon ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, AK OPENXML)
OUTER rantre nan(LEFT, RIGHT, Oswa FULL)

Tablo ki sòti (ki defini lè w espesifye a SELECT deklarasyon nan la FROM kloz)
Self-join
Espesifye kolòn lè l sèvi avèk SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, Oswa AVG
Ekspresyon tab komen (CTE)

flote1, tèks, ntèks, imaj, XML, Oswa filestream kolòn
subquery
OVER kloz, ki gen ladan fonksyon fenèt klasman oswa total

Predikatè tèks konplè (CONTAINS, FREETEXT)
SUM fonksyon ki fè referans a yon ekspresyon nullable
ORDER BY

CLR itilizatè-defini fonksyon total
TOP
CUBE, ROLLUP, Oswa GROUPING SETS Operatè

MIN, MAX
UNION, EXCEPT, Oswa INTERSECT Operatè
TABLESAMPLE

Tablo varyab
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Ansanm kolòn ra
Inline (TVF) oswa fonksyon milti-deklarasyon tab-valed functions (MSTVF)
OFFSET

CHECKSUM_AGG

OUTER JOINS, UNION, ORDER BY ak lòt moun entèdi. Li ta ka pi fasil pou presize sa ki ta ka itilize olye ke sa ki pa t 'kapab itilize. Lis la ta pwobableman pi piti anpil.

Pou rezime: yon seri gwo restriksyon nan chak (se pou nou sonje komèsyal) DBMS vs okenn (ak eksepsyon de yon sèl lojik, pa teknik) nan teknoloji LGPL. Sepandan, li ta dwe remake ke aplikasyon mekanis sa a nan lojik relasyon se yon ti jan pi difisil pase nan lojik fonksyonèl ki dekri a.

Aplikasyon

Ki jan li fonksyone? PostgreSQL yo itilize kòm yon "machin vityèl". Gen yon algorithm konplèks andedan ki bati demann. Isit la sous. Epi pa gen sèlman yon seri gwo euristik ak yon pakèt moun sou si. Se konsa, si ou gen yon koup de mwa yo etidye, ou ka eseye konprann achitekti.

Èske li travay efektivman? Byen efikas. Malerezman, sa a se difisil a pwouve. Mwen ka sèlman di ke si ou konsidere dè milye de requêtes ki egziste nan aplikasyon pou gwo, lè sa a an mwayèn yo pi efikas pase sa de yon bon devlopè. Yon pwogramè SQL ekselan ka ekri nenpòt demann pi efikas, men ak yon mil demann li tou senpleman pa pral gen motivasyon an oswa tan fè li. Sèl bagay mwen ka site kounye a kòm prèv efikasite se ke plizyè pwojè ap travay sou platfòm ki bati sou DBMS sa a. Sistèm ERP, ki gen plizyè milye fonksyon MATERIALIZE diferan, ak dè milye de itilizatè yo ak baz done teraocte ak dè santèn de milyon dosye ki kouri sou yon sèvè regilye de processeur. Sepandan, nenpòt moun ka tcheke / refite efikasite nan telechaje platfòm ak PostgreSQL, vire sou antre demann SQL epi eseye chanje lojik ak done la.

Nan atik sa yo, mwen pral pale tou sou fason ou ka mete restriksyon sou fonksyon, travay ak sesyon chanjman, ak plis ankò.

Sous: www.habr.com

Add nouvo kòmantè