Тавозуни навиштан ва хондан дар пойгоҳи додаҳо

Тавозуни навиштан ва хондан дар пойгоҳи додаҳо
Дар гузашта мақола Ман консепсия ва татбиқи пойгоҳи додаҳоро, ки дар асоси функсияҳо сохта шудааст, тавсиф кардам, на ҷадвалҳо ва майдонҳо, мисли пойгоҳи додаҳои релятсионӣ. Он мисолҳои зиёде овард, ки бартарии ин равишро нисбат ба усули классикӣ нишон медиҳанд. Бисёриҳо онҳоро ба қадри кофӣ боварибахш набуданд.

Дар ин мақола, ман нишон медиҳам, ки чӣ гуна ин консепсия ба шумо имкон медиҳад, ки бидуни тағирот дар мантиқи амалиётӣ навиштан ва хонданро ба пойгоҳи додаҳо зуд ва осон мувозинат кунед. Функсияҳои шабеҳ дар DBMS муосири тиҷоратӣ (хусусан, Oracle ва Microsoft SQL Server) амалӣ карда шуданд. Дар охири макола нишон медихам, ки кори онхо, агар нарм карда гуем, чандон самара набахшид.

Шарҳи

Мисли пештара, барои беҳтар фаҳмидани тавсиф ман бо мисолҳо оғоз мекунам. Фарз мекунем, ки мо бояд мантиқиеро амалӣ кунем, ки рӯйхати шӯъбаҳоро бо шумораи кормандон ва маоши умумии онҳо баргардонад.

Дар базаи функсионалӣ он чунин хоҳад буд:

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

Мушкилии иҷрои ин дархост дар ҳама гуна DBMS ба он баробар хоҳад буд О (шумораи кормандон)зеро ин хисоб скан кардани тамоми чадвали коркунон ва баъд аз руи шуъба гурухбандии онхоро талаб мекунад. Вобаста аз нақшаи интихобшуда, инчунин як қисми хурд (мо боварӣ дорем, ки коргарон нисбат ба шӯъбаҳо зиёданд) илова карда мешаванд. O (шумораи гузориши кормандон) ё О (шумораи шӯъбаҳо) барои гурӯҳбандӣ ва ғайра.

Равшан аст, ки хароҷоти иҷроиш дар DBMS-ҳои гуногун метавонад гуногун бошад, аммо мураккабӣ ба ҳеҷ ваҷҳ тағир намеёбад.

Дар татбиқи пешниҳодшуда, DBMS функсионалӣ як зерпурсишро тавлид мекунад, ки арзишҳои заруриро барои шӯъба ҳисоб мекунад ва сипас барои гирифтани ном бо ҷадвали шӯъба ҲАМРОХ мешавад. Бо вуҷуди ин, барои ҳар як функсия, ҳангоми эъломия, имкон дорад, ки аломати махсуси MATERIALIZED-ро муқаррар кард. Система ба таври худкор майдони мувофиқро барои ҳар як чунин функсия эҷод мекунад. Ҳангоми тағир додани арзиши функсия, арзиши майдон низ дар ҳамон транзаксия тағир меёбад. Ҳангоми дастрасӣ ба ин функсия, майдони пешакӣ ҳисобшуда дастрас карда мешавад.

Махсусан, агар шумо барои функсияҳо MATERIALIZED муқаррар карда бошед шумори кормандон и маош сум, баъд ба чадвал ду майдон бо руйхати шуъбахо илова карда мешавад, ки дар онхо шумораи коркунон ва музди умумии онхо нигох дошта мешавад. Ҳар вақте ки дар кормандон, музди меҳнат ё мансубияти шӯъбаҳо тағир меёбад, система ба таври худкор арзиши ин соҳаҳоро тағир медиҳад. Дархости дар боло зикршуда бевосита ба ин майдонҳо дастрасӣ пайдо мекунад ва дар он иҷро карда мешавад О (шумораи шӯъбаҳо).

Маҳдудиятҳо кадомҳоянд? Танҳо як чиз: чунин функсия бояд шумораи ниҳоии арзишҳои вурудро дошта бошад, ки барои онҳо арзиши он муайян карда мешавад. Дар акси ҳол, сохтани ҷадвале, ки тамоми арзишҳои онро нигоҳ медорад, ғайриимкон хоҳад буд, зеро ҷадвали дорои шумораи беохири сатрҳо вуҷуд надорад.

Мисол:

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

Ин функсия барои шумораи беохири арзишҳои N муайян карда мешавад (масалан, ҳама гуна арзиши манфӣ мувофиқ аст). Аз ин рӯ, шумо наметавонед ба он MATRIALIZED гузоред. Ҳамин тавр, ин маҳдудияти мантиқӣ аст, на техникӣ (яъне на аз он сабаб, ки мо онро амалӣ карда натавонистем). Дар акси ҳол, ҳеҷ гуна маҳдудият вуҷуд надорад. Шумо метавонед гурӯҳбандӣ, ҷудокунӣ, ВА ва Ё, PARTITION, рекурсия ва ғайраро истифода баред.

Масалан, дар масъалаи 2.2-и мақолаи қаблӣ, шумо метавонед дар ҳарду функсия MATERIALIZED гузоред:

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;

Худи система як ҷадвалро бо калидҳои типӣ эҷод мекунад муштариён, Маҳсулоти и ТАМОМ, ба он ду майдон илова мекунад ва арзишҳои майдонро дар онҳо бо ҳама гуна тағирот нав мекунад. Вақте ки зангҳои минбаъда ба ин функсияҳо анҷом дода мешаванд, онҳо ҳисоб карда намешаванд, балки арзишҳо аз майдонҳои мувофиқ хонда мешаванд.

Бо истифода аз ин механизм, шумо метавонед, масалан, аз рекурсияҳо (CTE) дар дархостҳо халос шавед. Аз ҷумла, гурӯҳҳоеро баррасӣ кунед, ки дарахтро бо истифода аз муносибатҳои кӯдакон/волидон ташкил медиҳанд (ҳар гурӯҳ бо волидайни худ робита дорад):

parent = DATA Group (Group);

Дар базаи функсионалӣ мантиқи рекурсияро метавон ба таври зерин муайян кард:

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;

Азбаски барои функсия волидайн аст МАТЕРИАЛИЗАЦИЯ қайд карда мешавад, пас барои он ҷадвал бо ду калид (гурӯҳ) сохта мешавад, ки дар он майдон волидайн аст танҳо агар калиди аввал кӯдаки дуюм бошад, дуруст хоҳад буд. Шумораи сабтҳо дар ин ҷадвал ба шумораи гурӯҳҳо, ки ба умқи миёнаи дарахт зарб шудаанд, баробар хоҳад буд. Агар ба шумо, масалан, барои ҳисоб кардани шумораи наслҳои як гурӯҳи муайян лозим бошад, шумо метавонед ин функсияро истифода баред:

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

Дар дархости SQL CTE вуҷуд нахоҳад дошт. Ба ҷои ин як GROUP BY оддӣ хоҳад буд.

Бо истифода аз ин механизм, шумо инчунин метавонед ба осонӣ пойгоҳи додаҳоро дар ҳолати зарурӣ ғайримуқаррарӣ кунед:

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

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

Ҳангоми даъват кардани функсия таърих барои сатри фармоиш, майдоне, ки барои он индекс мавҷуд аст, аз ҷадвал бо сатрҳои фармоиш хонда мешавад. Вақте ки санаи фармоиш тағир меёбад, худи система санаи ғайримуқаррариро дар сатр ба таври худкор аз нав ҳисоб мекунад.

афзалияти

Ин тамоми механизм барои чист? Дар DBMS-и классикӣ, бидуни навиштани дархостҳо, таҳиякунанда ё DBA метавонад танҳо индексҳоро тағир диҳад, оморро муайян кунад ва ба банақшагирандаи дархост чӣ гуна иҷро кардани онҳоро бигӯяд (ва Маслиҳатҳо танҳо дар DBMS тиҷоратӣ дастрасанд). Новобаста аз он ки онҳо чӣ қадар кӯшиш кунанд, онҳо наметавонанд дархости аввалини мақоларо ба анҷом расонанд О (шумораи шӯъбаҳо) бе тағир додани дархостҳо ё илова кардани триггерҳо. Дар нақшаи пешниҳодшуда, дар марҳилаи таҳия ба шумо лозим нест, ки дар бораи сохтори нигоҳдории маълумот ва кадом агрегатҳо истифода баред, фикр кунед. Ҳамаи ин метавонад ба осонӣ дар парвоз, бевосита дар амалиёт иваз карда шавад.

Дар амал чунин менамояд. Баъзе одамон мантиқро бевосита дар асоси вазифаи дар пеш истода инкишоф медиҳанд. Онҳо алгоритмҳо ва мураккабии онҳо, нақшаҳои иҷро, намудҳои пайвастшавӣ ё ягон ҷузъи дигари техникиро намефаҳманд. Ин одамон нисбат ба таҳиягарон бештар таҳлилгари тиҷорат мебошанд. Сипас, ҳамаи ин ба озмоиш ё амалиёт мегузарад. Сабти дархостҳои дарозмуддатро имкон медиҳад. Вақте ки дархости тӯлонӣ ошкор карда мешавад, пас одамони дигар (техникӣ бештар - аслан DBA) тасмим мегиранд, ки MATERIALIZED-ро дар баъзе функсияҳои мобайнӣ фаъол созанд. Ин сабтро каме суст мекунад (зеро он навсозии майдони иловагиро дар транзаксия талаб мекунад). Бо вуҷуди ин, на танҳо ин дархост, балки инчунин ҳамаи дигарҳое, ки ин функсияро истифода мебаранд, ба таври назаррас суръат мебахшанд. Дар айни замон, муайян кардани он, ки кадом функсия ба амал бароварда мешавад, нисбатан содда аст. Ду параметри асосӣ: шумораи арзишҳои имконпазири вуруд (ин аст, ки дар ҷадвали мувофиқ чӣ қадар сабтҳо хоҳанд буд) ва чӣ қадар вақт он дар дигар вазифаҳо истифода мешавад.

Аналогҳо

МДМ муосири тиҷорӣ механизмҳои шабеҳ доранд: НАМОИШИ МОДДӢ бо FAST REFRESH (Oracle) ва INDEXED VIEW (Microsoft SQL Server). Дар PostgreSQL, НАМОИШИ моддӣ дар транзаксия навсозӣ карда намешавад, аммо танҳо дар асоси дархост (ва ҳатто бо маҳдудиятҳои хеле сахт), аз ин рӯ мо онро баррасӣ намекунем. Аммо онҳо якчанд мушкилот доранд, ки истифодаи онҳоро ба таври назаррас маҳдуд мекунанд.

Аввалан, шумо метавонед танҳо маводро фаъол созед, агар шумо аллакай VIEW-и муқаррариро эҷод карда бошед. Дар акси ҳол, шумо бояд дархостҳои боқимондаро барои дастрасӣ ба намуди навтаъсис аз нав нависед, то ин маводро истифода баред. Ё ҳама чизро ҳамон тавре ки ҳаст, тарк кунед, аммо он ҳадди аққал бесамар хоҳад буд, агар маълумоти пешакӣ ҳисобшуда мавҷуд бошад, аммо бисёр дархостҳо на ҳамеша онро истифода мебаранд, балки онро дубора ҳисоб мекунанд.

Дуюм, онҳо шумораи зиёди маҳдудиятҳо доранд:

Oracle

5.3.8.4 Маҳдудиятҳои умумӣ оид ба навсозии зуд

Дархости муайянкунандаи намуди моддӣ ба таври зерин маҳдуд карда мешавад:

  • Намоиши моддӣ набояд истинодҳоро ба ибораҳои такрорнашаванда дар бар гирад SYSDATE ва ROWNUM.
  • Намоиши моддӣ набояд истинодҳоро дар бар гирад RAW or LONG RAW намудҳои маълумот.
  • Он дорои а SELECT зер дархости рӯйхат.
  • Он дорои функсияҳои таҳлилӣ буда наметавонад (масалан, RANK) дар SELECT матн
  • Он наметавонад ба ҷадвале, ки дар он XMLIndex индекс муайян карда мешавад.
  • Он дорои а MODEL матн
  • Он дорои а HAVING банди бо зерпурсиш.
  • Он дорои дархостҳои лона буда наметавонад ANY, ALL, ё NOT EXISTS.
  • Он дорои а [START WITH …] CONNECT BY матн
  • Он наметавонад ҷадвалҳои тафсилоти сершуморро дар сайтҳои гуногун дар бар гирад.
  • ON COMMIT Намоишҳои моддӣ наметавонанд ҷадвалҳои тафсилоти дурдаст дошта бошанд.
  • Намоишҳои моддӣшудаи дохилӣ бояд пайваст ё ҷамъ дошта бошанд.
  • Намоишҳои муттаҳидшудаи моддӣ ва маҷмӯаи маҷмӯӣ бо а GROUP BY банди аз ҷадвали аз рӯи индекс ташкилшуда интихоб карда наметавонад.

5.3.8.5 Маҳдудиятҳо оид ба навсозии зуд оид ба намоишҳои моддӣ танҳо бо ҳамроҳшавӣ

Муайян кардани дархостҳо барои намоишҳои моддӣ танҳо бо пайвастшавӣ ва ҳеҷ агрегатҳо маҳдудиятҳои зеринро барои навсозии зуд надоранд:

  • Ҳама маҳдудиятҳо аз «Маҳдудиятҳои умумӣ оид ба навсозии зуд".
  • Онҳо наметавонанд дошта бошанд GROUP BY бандҳо ё ҷамъбастҳо.
  • Сатрҳои ҳамаи ҷадвалҳо дар FROM рӯйхат бояд дар SELECT рӯйхати дархост.
  • Гузоришҳои намоишии моддӣ бояд бо сатрҳо барои ҳамаи ҷадвалҳои асосӣ дар FROM рӯйхати дархост.
  • Шумо наметавонед аз ҷадвалҳои сершумор бо пайвастагиҳои оддӣ, ки сутуни навъи объектро дар бар мегиранд, намуди моддӣшавандаи зуд барқароршаванда эҷод кунед. SELECT изҳорот.

Инчунин, усули навсозии интихобкардаи шумо ба таври оптималӣ самаранок нахоҳад буд, агар:

  • Дархости муайянкунанда пайвасти беруниро истифода мебарад, ки мисли пайвастагии ботинӣ рафтор мекунад. Агар дархости муайянкунанда чунин пайвастагиро дар бар гирад, дар бораи аз нав навиштани дархости муайянкунанда фикр кунед, ки пайвастагии ботиниро дар бар гирад.
  • Дар SELECT рӯйхати намоиши моддӣ ифодаҳоро дар сутунҳои ҷадвалҳои сершумор дар бар мегирад.

5.3.8.6 Маҳдудиятҳо оид ба навсозии зуд дар намоишҳои моддӣ бо агрегатҳо

Муайян кардани дархостҳо барои намоишҳои моддӣ бо агрегатҳо ё пайвастшавӣ маҳдудиятҳои зеринро барои навсозии зуд дорад:

Навсозии зуд барои ҳарду дастгирӣ карда мешавад ON COMMIT ва ON DEMAND ақидаҳои амалӣ, вале маҳдудиятҳои зерин татбиқ мешаванд:

  • Ҳама ҷадвалҳо дар намуди моддӣ бояд гузоришҳои намоиши моддӣ дошта бошанд ва гузоришҳои намоиши моддӣ бояд:
    • Ҳама сутунҳоро аз ҷадвали истинодшуда дар намуди моддӣ дар бар гиред.
    • Муайян кунед бо ROWID ва INCLUDING NEW VALUES.
    • Муайян кунед SEQUENCE банди, агар ҷадвал интизор шавад, ки омехтаи воридкунӣ/боркунии мустақим, несткунӣ ва навсозӣ дошта бошад.

  • танҳо SUM, COUNT, AVG, STDDEV, VARIANCE, MIN ва MAX барои навсозии зуд дастгирӣ карда мешаванд.
  • COUNT(*) бояд муайян карда шавад.
  • Функсияҳои ҷамъшуда бояд танҳо ҳамчун қисми берунии ифода ба амал оянд. Яъне агрегатхо ба монанди AVG(AVG(x)) or AVG(x)+ AVG(x) иҷозат дода намешавад.
  • Барои хар як агрегат ба монанди AVG(expr), мувофиқ COUNT(expr) бояд хозир бошад. Oracle тавсия медиҳад SUM(expr) муайян карда шавад.
  • If VARIANCE(expr) or STDDEV(expr) муайян карда шудааст, COUNT(expr) ва SUM(expr) бояд муайян карда шавад. Oracle тавсия медиҳад SUM(expr *expr) муайян карда шавад.
  • Дар SELECT сутун дар дархости муайянкунанда наметавонад ифодаи мураккаб бо сутунҳо аз якчанд ҷадвалҳои асосӣ бошад. Як роҳи ҳалли имконпазири ин истифодаи намуди моддӣшудаи лона мебошад.
  • Дар SELECT рӯйхат бояд ҳамаро дар бар гирад GROUP BY сутунҳо.
  • Намоиши моддӣ ба як ё якчанд ҷадвалҳои дурдаст асос надорад.
  • Агар шумо а CHAR навъи маълумот дар сутунҳои филтри гузориши намоиши моддӣ, маҷмӯи аломатҳои сайти асосӣ ва намуди моддӣ бояд якхела бошанд.
  • Агар намуди амалӣшуда яке аз инҳоро дошта бошад, пас навсозии зуд танҳо дар замимаҳои муқаррарии DML ва сарбориҳои мустақим дастгирӣ карда мешавад.
    • Андешаҳои моддӣ бо MIN or MAX агрегатҳо
    • Андешаҳои моддӣ, ки доранд SUM(expr) аммо не COUNT(expr)
    • Андешаҳои моддӣ бе COUNT(*)

    Чунин намуди моддӣ намуди танҳо барои воридшаванда номида мешавад.

  • Намоиши моддӣ бо MAX or MIN пас аз нест кардан ё изҳороти омехтаи DML зуд навсозӣ мешавад, агар он дорои а WHERE матн
    Навсозии босуръати максимум/дақ пас аз нест кардан ё омехтаи DML рафтори якхеларо бо ҳолати танҳо ворид кардан надорад. Он арзишҳои максимум/миниро барои гурӯҳҳои зарардида нест мекунад ва аз нав ҳисоб мекунад. Шумо бояд аз таъсири самаранокии он огоҳ бошед.
  • Намоишҳои моддӣ бо намоишҳои номбаршуда ё зерпурсишҳо дар FROM бандро зуд нав кардан мумкин аст, ба шарте ки манзараҳо комилан якҷоя карда шаванд. Барои маълумот дар бораи он, ки кадом намудҳо якҷоя мешаванд, нигаред Reference забони Oracle Database SQL.
  • Агар пайвастҳои беруна вуҷуд надошта бошанд, шумо метавонед интихобҳои худсарона дошта бошед ва дар WHERE матн
  • Намоишҳои маҷмӯӣ бо пайвастагиҳои беруна пас аз DML-и муқаррарӣ ва сарбориҳои мустақим зуд нав карда мешаванд, ба шарте ки танҳо ҷадвали берунӣ тағир дода шавад. Инчунин, бояд дар сутунҳои пайвастшавии ҷадвали дохили дохилӣ маҳдудиятҳои беназир мавҷуд бошанд. Агар пайвастагиҳои беруна мавҷуд бошанд, ҳамаи пайвастҳо бояд тавассути пайваст карда шаванд ANDs ва бояд баробариро истифода барад (=) оператор.
  • Барои назари моддӣ бо CUBE, ROLLUP, маҷмӯи гурӯҳҳо ё пайвастани онҳо, маҳдудиятҳои зерин татбиқ мешаванд:
    • Дар SELECT рӯйхат бояд фарқкунандаи гурӯҳбандӣ дошта бошад, ки метавонад ё бошад GROUPING_ID дар ҳама кор GROUP BY ифода ё GROUPING барои ҳар яке як вазифа мекунад GROUP BY ифода. Масалан, агар GROUP BY банди назари моддӣ аст "GROUP BY CUBE(a, b)", баъд SELECT рӯйхат бояд яке аз "GROUPING_ID(a, b)» ё «GROUPING(a) AND GROUPING(b)» барои он ки манзараи моддӣ зуд навшаванда бошад.
    • GROUP BY набояд ба ягон гурӯҳбандии такрорӣ оварда расонад. Барои намуна, "GROUP BY a, ROLLUP(a, b)"зуд навсозӣ намешавад, зеро он ба гурӯҳҳои такрорӣ оварда мерасонад"(a), (a, b), AND (a)".

5.3.8.7 Маҳдудиятҳо оид ба навсозии зуд оид ба намоишҳои моддӣ бо UNION ALL

Андешаҳои моддӣ бо UNION ALL танзим операторро дастгирӣ мекунад REFRESH FAST вариант, агар шартҳои зерин иҷро шаванд:

  • Дархости муайянкунанда бояд дорои UNION ALL оператор дар сатҳи боло.

    Дар UNION ALL операторро дар дохили зерпурсиш ворид кардан мумкин нест, ба истиснои як истисно: The UNION ALL метавонад дар зерпурсиш дар FROM банди, ба шарте ки дархости муайянкунанда аз шакл бошад SELECT * FROM (намоиш ё зерпурсиш бо UNION ALL) тавре ки дар мисоли зерин:

    Эҷоди VIEW view_with_unionall AS
    (SELECT c.rowid crid, c.cust_id, 2 umarker
     АЗ муштариён c WHERE c.cust_last_name = 'Смит'
     ХАМА ИТТИФОК
     SELECT c.rowid crid, c.cust_id, 3 umarker
     АЗ мизоҷон c WHERE c.cust_last_name = 'Ҷонс');
    
    Эҷоди Намоиши моддӣ unionall_inside_view_mv
    АЗ БАРОИ ТАЛАБ ЗУД ТАРОВА КУНЕД AS
    ИНТИХОБ * АЗ view_with_unionall;
    

    Дар хотир доред, ки манзара view_with_unionall талаботи навсозии зудро қонеъ мегардонад.

  • Ҳар як блоки дархост дар UNION ALL пурсиш бояд ба талаботи намуди зудтаҷдидшавандаи моддӣ бо агрегатҳо ё намуди зудтаҷдидшавандаи моддӣ бо пайвастшавӣ қонеъ гардонад.

    Гузоришҳои мувофиқи намоиши моддӣ бояд дар ҷадвалҳо тавре сохта шаванд, ки барои намуди мувофиқи намоиши зудтаҷдидшаванда заруранд.
    Аҳамият диҳед, ки пойгоҳи додаҳои Oracle инчунин имкон медиҳад, ки ҳолати махсуси як ҷадвали моддӣ бо пайвастшавӣ танҳо бо шарти ROWID сутун дохил карда шудааст SELECT рӯйхат ва дар гузориши намоиши моддӣ. Ин дар дархости муайянкунандаи намуд нишон дода шудааст view_with_unionall.

  • Дар SELECT рӯйхати ҳар як дархост бояд а бошад UNION ALL маркер, ва UNION ALL сутун бояд дар ҳар як арзиши доимии ададӣ ё сатр дошта бошад UNION ALL филиал. Ғайр аз он, сутуни маркер бояд дар ҳамон мавқеи тартибӣ дар SELECT рӯйхати ҳар як блоки дархост. бинед "UNION ALL Marker ва Query Rewrite» барои маълумоти бештар дар бораи UNION ALL нишонгузорҳо.
  • Баъзе хусусиятҳо, аз қабили пайвастагиҳои беруна, пурсишҳои маҷмӯии намоиши танҳо воридшаванда ва ҷадвалҳои дурдаст барои намоишҳои моддӣ бо UNION ALL. Бо вуҷуди ин, дар хотир доред, ки манзараҳои моддӣ, ки дар репликатсия истифода мешаванд, ки пайвастагиҳо ё агрегатҳоро дар бар намегиранд, вақте ки метавонанд зуд нав карда шаванд. UNION ALL ё ҷадвалҳои дурдаст истифода мешаванд.
  • Параметри ибтидоии мутобиқат бояд ба 9.2.0 ё баландтар таъин карда шавад, то намуди зуд навшавандаро эҷод кунад. UNION ALL.

Ман намехоҳам мухлисони Oracle-ро хафа кунам, аммо аз рӯи рӯйхати маҳдудиятҳои онҳо, чунин ба назар мерасад, ки ин механизм на дар сурати умумӣ, бо истифода аз як намуди модел, балки аз ҷониби ҳазорон ҳиндуҳо навишта шудааст, ки дар он ҳама имкони шохаи худро менависанд ва хар кадоми онхо кори аз дасташ меомадагиро мекард. Истифодаи ин механизм барои мантиқи воқеӣ мисли гузаштан аз майдони мина аст. Шумо метавонед дар вақти дилхоҳ бо пахш кардани яке аз маҳдудиятҳои норавшан мина ба даст оред. Чӣ тавр кор кардани он низ як саволи алоҳида аст, аммо он аз доираи ин мақола берун аст.

Microsoft SQL Server

Талаботи иловагӣ

Илова ба имконоти SET ва талаботҳои функсияи муайянкунанда, талаботҳои зерин бояд риоя карда шаванд:

  • Корбаре, ки иҷро мекунад CREATE INDEX бояд сохиби манзара бошад.
  • Вақте ки шумо индексро эҷод мекунед, IGNORE_DUP_KEY хосият бояд ба OFF (танзимоти пешфарз) таъин карда шавад.
  • Ҷадвалҳо бояд бо номҳои ду қисм истинод карда шаванд, Шабака.номи мизи дар таърифи назари.
  • Функсияҳои аз ҷониби корбар муайяншуда, ки дар намоиш истинод шудаанд, бояд бо истифода аз WITH SCHEMABINDING хосият.
  • Ҳама функсияҳои аз ҷониби корбар муайяншуда, ки дар намоиш истинод шудаанд, бояд бо номҳои ду қисм истинод карда шаванд, ..
  • Амволи дастрасии додаҳои функсияи аз ҷониби корбар муайяншуда бояд бошад NO SQL, ва моликияти дастрасии беруна бояд бошад NO.
  • Функсияҳои вақти корбарии забони умумӣ (CLR) метавонанд дар рӯйхати интихобшудаи намоиш пайдо шаванд, аммо ҷузъи таърифи калиди шохиси кластерӣ буда наметавонанд. Функсияҳои CLR наметавонанд дар банди WHERE-и намуд ё банди ON-и амалиёти JOIN дар намуд пайдо шаванд.
  • Функсияҳои CLR ва усулҳои намудҳои аз ҷониби корбар муайяншудаи CLR, ки дар таърифи намоиш истифода мешаванд, бояд дорои хосиятҳое бошанд, ки дар ҷадвали зерин нишон дода шудаанд.

    молу мулк
    Шарҳ

    ДЕТЕРМИНИСТИК = ДУРУСТ
    Бояд ба таври возеҳ ҳамчун атрибути усули Microsoft .NET Framework эълон карда шавад.

    Дақиқ = РОСТ
    Бояд ба таври возеҳ ҳамчун атрибути усули .NET Framework эълон карда шавад.

    ДАСТРАСИИ МАЪЛУМОТ = НЕ SQL
    Бо гузоштани атрибути DataAccess ба DataAccessKind.None ва SystemDataAccess ба SystemDataAccessKind.None муайян карда мешавад.

    ДАСТРАСИ БЕРУНИИ = НЕ
    Ин амвол барои реҷаҳои CLR пешфарз НЕ аст.

  • Намоиш бояд бо истифода аз WITH SCHEMABINDING хосият.
  • Намоиш бояд танҳо ба ҷадвалҳои асосие, ки дар як пойгоҳи додаҳо бо намоиш ҷойгиранд, истинод кунад. Намоиш наметавонад ба назари дигар истинод кунад.
  • Изҳороти SELECT дар таърифи намоиш набояд унсурҳои зерини Transact-SQL-ро дар бар гирад:

    COUNT
    Функсияҳои ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, ВА OPENXML)
    OUTER ҳамроҳ мешавад (LEFT, RIGHT, ё FULL)

    Ҷадвали ҳосилшуда (бо нишон додани a SELECT изҳорот дар FROM банди)
    Худшиносӣ ҳамроҳ мешавад
    Муайян кардани сутунҳо бо истифода аз SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, ё AVG
    Ифодаи ҷадвали умумӣ (CTE)

    данд1, матн, ntext, Садо, XML, ё ҷараёни файлҳо сутунҳо
    Зерпурси
    OVER банди, ки функсияҳои рейтинг ё маҷмӯи равзанаро дар бар мегирад

    Предикатҳои пурраи матн (CONTAINS, FREETEXT)
    SUM функсияе, ки ба ифодаи беэътибор истинод мекунад
    ORDER BY

    Функсияи маҷмӯии аз ҷониби корбар муайяншудаи CLR
    TOP
    CUBE, ROLLUP, ё GROUPING SETS операторҳо

    MIN, MAX
    UNION, EXCEPT, ё INTERSECT операторҳо
    TABLESAMPLE

    Тағйирёбандаҳои ҷадвал
    OUTER APPLY or CROSS APPLY
    PIVOT, UNPIVOT

    Маҷмӯаҳои сутунҳои пароканда
    Функсияҳои дарунсохт (TVF) ё чанд изҳороти ҷадвали арзишманд (MSTVF)
    OFFSET

    CHECKSUM_AGG

    1 Намоиши индексатсияшуда метавонад дорои данд сутунҳо; аммо чунин сутунҳоро ба калиди шохиси кластерӣ дохил кардан мумкин нест.

  • If GROUP BY мавҷуд бошад, таърифи VIEW бояд дар бар гирад COUNT_BIG(*) ва набояд дар бар гирад HAVING. онҳо GROUP BY маҳдудиятҳо танҳо ба таърифи намуди индексатсияшуда татбиқ мешаванд. Пурсиш метавонад намуди индексатсияшударо дар нақшаи иҷроиш истифода барад, ҳатто агар он онҳоро қонеъ накунад GROUP BY маҳдудиятҳо.
  • Агар таърифи намоиш дорои а GROUP BY банди, калиди шохиси ягонаи кластерӣ метавонад танҳо ба сутунҳои дар дар GROUP BY матн

Дар ин ҷо равшан аст, ки ҳиндуҳо иштирок накардаанд, зеро онҳо қарор доданд, ки ин корро мувофиқи нақшаи "мо кам мекунем, аммо хуб мекунем". Яъне дар саҳро минаҳои бештар доранд, аммо ҷойгиршавии онҳо шаффофтар аст. Аз ҳама таассуфовар ин маҳдудият аст:

Намоиш бояд танҳо ба ҷадвалҳои асосие, ки дар як пойгоҳи додаҳо бо намоиш ҷойгиранд, истинод кунад. Намоиш наметавонад ба назари дигар истинод кунад.

Дар истилоҳоти мо, ин маънои онро дорад, ки функсия ба дигар функсияи моддӣ дастрасӣ надорад. Ин тамоми идеологияро дар гурда мерезад.
Инчунин, ин маҳдудият (ва минбаъд дар матн) ҳолатҳои истифодаро хеле кам мекунад:

Изҳороти SELECT дар таърифи намоиш набояд унсурҳои зерини Transact-SQL-ро дар бар гирад:

COUNT
Функсияҳои ROWSET (OPENDATASOURCE, OPENQUERY, OPENROWSET, ВА OPENXML)
OUTER ҳамроҳ мешавад (LEFT, RIGHT, ё FULL)

Ҷадвали ҳосилшуда (бо нишон додани a SELECT изҳорот дар FROM банди)
Худшиносӣ ҳамроҳ мешавад
Муайян кардани сутунҳо бо истифода аз SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, ё AVG
Ифодаи ҷадвали умумӣ (CTE)

данд1, матн, ntext, Садо, XML, ё ҷараёни файлҳо сутунҳо
Зерпурси
OVER банди, ки функсияҳои рейтинг ё маҷмӯи равзанаро дар бар мегирад

Предикатҳои пурраи матн (CONTAINS, FREETEXT)
SUM функсияе, ки ба ифодаи беэътибор истинод мекунад
ORDER BY

Функсияи маҷмӯии аз ҷониби корбар муайяншудаи CLR
TOP
CUBE, ROLLUP, ё GROUPING SETS операторҳо

MIN, MAX
UNION, EXCEPT, ё INTERSECT операторҳо
TABLESAMPLE

Тағйирёбандаҳои ҷадвал
OUTER APPLY or CROSS APPLY
PIVOT, UNPIVOT

Маҷмӯаҳои сутунҳои пароканда
Функсияҳои дарунсохт (TVF) ё чанд изҳороти ҷадвали арзишманд (MSTVF)
OFFSET

CHECKSUM_AGG

ИТТИФОКХОИ БЕРУНЙ, ИТТИФОКХО, ТАРБИЯИ БЙ ва гайра манъ аст. Муайян кардани он чиро метавон истифода бурд, на он чизе ки истифода намешавад. Рӯйхат шояд хеле кӯтоҳтар бошад.

Барои ҷамъбаст: маҷмӯи бузурги маҳдудиятҳо дар ҳар як (биёед тиҷоратӣ қайд кунем) DBMS ва ҳеҷ яке (ба истиснои як мантиқӣ, на техникӣ) дар технологияи LGPL. Аммо бояд гуфт, ки татбиќи ин механизм дар мантиќи муносибатњо нисбат ба мантиќи функсионалии тавсифшуда то андозае мушкилтар аст.

Реализация

Он чӣ гуна кор мекунад? PostgreSQL ҳамчун "мошини виртуалӣ" истифода мешавад. Дар дохили он як алгоритми мураккаб мавҷуд аст, ки дархостҳоро месозад. Ин ҷо сарчашма. Ва на танҳо маҷмӯи бузурги эвристикӣ бо як қатор if's вуҷуд дорад. Ҳамин тавр, агар шумо якчанд моҳ барои таҳсил дошта бошед, шумо метавонед кӯшиш кунед, ки меъмориро бифаҳмед.

Оё он самаранок кор мекунад? Хеле самаранок. Мутаассифона, инро исбот кардан душвор аст. Ман танҳо гуфта метавонам, ки агар шумо ҳазорон дархостҳоеро, ки дар замимаҳои калон мавҷуданд, баррасӣ кунед, пас онҳо ба ҳисоби миёна нисбат ба саволҳои таҳиягари хуб самараноктаранд. Як барномасози аълои SQL метавонад ҳама гуна дархостро ба таври муассиртар нависад, аммо бо ҳазорҳо дархост ӯ барои иҷрои ин кор ҳавасмандӣ ва вақт надорад. Ягона чизе, ки ман ҳоло метавонам ҳамчун далели самаранокӣ зикр кунам, ин аст, ки якчанд лоиҳаҳо дар платформаи дар ин DBMS сохташуда кор мекунанд. Системаҳои ERP, ки дорои ҳазорон функсияҳои гуногуни MATERIALIZED, бо ҳазорон корбарон ва пойгоҳи додаҳои терабайтӣ бо садҳо миллион сабтҳо дар сервери муқаррарии ду протсессор кор мекунанд. Бо вуҷуди ин, ҳар кас метавонад тавассути зеркашӣ самаранокии онро тафтиш / рад кунад платформае ва PostgreSQL, даргиронда сабти дархостҳои SQL ва кӯшиши тағир додани мантиқ ва маълумот дар он ҷо.

Дар мақолаҳои навбатӣ, ман инчунин дар бораи он, ки чӣ гуна шумо метавонед маҳдудиятҳоро дар функсияҳо муқаррар кунед, бо ҷаласаҳои тағирот кор кунед ва ғайра сӯҳбат хоҳам кард.

Манбаъ: will.com

Илова Эзоҳ