Мисли пештара, барои беҳтар фаҳмидани тавсиф ман бо мисолҳо оғоз мекунам. Фарз мекунем, ки мо бояд мантиқиеро амалӣ кунем, ки рӯйхати шӯъбаҳоро бо шумораи кормандон ва маоши умумии онҳо баргардонад.
Дар базаи функсионалӣ он чунин хоҳад буд:
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;
employeesCount ‘Количество сотрудников с зарплатой > N’ (Department d, NUMERIC[10,2] N) =
GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;
Ин функсия барои шумораи беохири арзишҳои N муайян карда мешавад (масалан, ҳама гуна арзиши манфӣ мувофиқ аст). Аз ин рӯ, шумо наметавонед ба он MATRIALIZED гузоред. Ҳамин тавр, ин маҳдудияти мантиқӣ аст, на техникӣ (яъне на аз он сабаб, ки мо онро амалӣ карда натавонистем). Дар акси ҳол, ҳеҷ гуна маҳдудият вуҷуд надорад. Шумо метавонед гурӯҳбандӣ, ҷудокунӣ, ВА ва Ё, PARTITION, рекурсия ва ғайраро истифода баред.
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) дар дархостҳо халос шавед. Аз ҷумла, гурӯҳҳоеро баррасӣ кунед, ки дарахтро бо истифода аз муносибатҳои кӯдакон/волидон ташкил медиҳанд (ҳар гурӯҳ бо волидайни худ робита дорад):
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;
Намоиши моддӣ бо MAX or MIN пас аз нест кардан ё изҳороти омехтаи DML зуд навсозӣ мешавад, агар он дорои а WHERE матн
Навсозии босуръати максимум/дақ пас аз нест кардан ё омехтаи DML рафтори якхеларо бо ҳолати танҳо ворид кардан надорад. Он арзишҳои максимум/миниро барои гурӯҳҳои зарардида нест мекунад ва аз нав ҳисоб мекунад. Шумо бояд аз таъсири самаранокии он огоҳ бошед.
Дар UNIONALL операторро дар дохили зерпурсиш ворид кардан мумкин нест, ба истиснои як истисно: The UNIONALL метавонад дар зерпурсиш дар FROM банди, ба шарте ки дархости муайянкунанда аз шакл бошад SELECT * FROM (намоиш ё зерпурсиш бо UNIONALL) тавре ки дар мисоли зерин:
Эҷоди 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;
Дар SELECT рӯйхати ҳар як дархост бояд а бошад UNIONALL маркер, ва UNIONALL сутун бояд дар ҳар як арзиши доимии ададӣ ё сатр дошта бошад UNIONALL филиал. Ғайр аз он, сутуни маркер бояд дар ҳамон мавқеи тартибӣ дар SELECT рӯйхати ҳар як блоки дархост. бинед "UNION ALL Marker ва Query Rewrite» барои маълумоти бештар дар бораи UNIONALL нишонгузорҳо.
Ман намехоҳам мухлисони Oracle-ро хафа кунам, аммо аз рӯи рӯйхати маҳдудиятҳои онҳо, чунин ба назар мерасад, ки ин механизм на дар сурати умумӣ, бо истифода аз як намуди модел, балки аз ҷониби ҳазорон ҳиндуҳо навишта шудааст, ки дар он ҳама имкони шохаи худро менависанд ва хар кадоми онхо кори аз дасташ меомадагиро мекард. Истифодаи ин механизм барои мантиқи воқеӣ мисли гузаштан аз майдони мина аст. Шумо метавонед дар вақти дилхоҳ бо пахш кардани яке аз маҳдудиятҳои норавшан мина ба даст оред. Чӣ тавр кор кардани он низ як саволи алоҳида аст, аммо он аз доираи ин мақола берун аст.
Microsoft SQL Server
Талаботи иловагӣ
Илова ба имконоти SET ва талаботҳои функсияи муайянкунанда, талаботҳои зерин бояд риоя карда шаванд:
Корбаре, ки иҷро мекунад CREATE INDEX бояд сохиби манзара бошад.
Ҷадвали ҳосилшуда (бо нишон додани a SELECT изҳорот дар FROM банди)
Худшиносӣ ҳамроҳ мешавад
Муайян кардани сутунҳо бо истифода аз SELECT * or SELECT <table_name>.*
If GROUP BY мавҷуд бошад, таърифи VIEW бояд дар бар гирад COUNT_BIG(*) ва набояд дар бар гирад HAVING. онҳо GROUP BY маҳдудиятҳо танҳо ба таърифи намуди индексатсияшуда татбиқ мешаванд. Пурсиш метавонад намуди индексатсияшударо дар нақшаи иҷроиш истифода барад, ҳатто агар он онҳоро қонеъ накунад GROUP BY маҳдудиятҳо.
Агар таърифи намоиш дорои а GROUP BY банди, калиди шохиси ягонаи кластерӣ метавонад танҳо ба сутунҳои дар дар GROUP BY матн
Дар ин ҷо равшан аст, ки ҳиндуҳо иштирок накардаанд, зеро онҳо қарор доданд, ки ин корро мувофиқи нақшаи "мо кам мекунем, аммо хуб мекунем". Яъне дар саҳро минаҳои бештар доранд, аммо ҷойгиршавии онҳо шаффофтар аст. Аз ҳама таассуфовар ин маҳдудият аст:
Ҷадвали ҳосилшуда (бо нишон додани a SELECT изҳорот дар FROM банди)
Худшиносӣ ҳамроҳ мешавад
Муайян кардани сутунҳо бо истифода аз SELECT * or SELECT <table_name>.*
ИТТИФОКХОИ БЕРУНЙ, ИТТИФОКХО, ТАРБИЯИ БЙ ва гайра манъ аст. Муайян кардани он чиро метавон истифода бурд, на он чизе ки истифода намешавад. Рӯйхат шояд хеле кӯтоҳтар бошад.
Барои ҷамъбаст: маҷмӯи бузурги маҳдудиятҳо дар ҳар як (биёед тиҷоратӣ қайд кунем) DBMS ва ҳеҷ яке (ба истиснои як мантиқӣ, на техникӣ) дар технологияи LGPL. Аммо бояд гуфт, ки татбиќи ин механизм дар мантиќи муносибатњо нисбат ба мантиќи функсионалии тавсифшуда то андозае мушкилтар аст.
Реализация
Он чӣ гуна кор мекунад? PostgreSQL ҳамчун "мошини виртуалӣ" истифода мешавад. Дар дохили он як алгоритми мураккаб мавҷуд аст, ки дархостҳоро месозад. Ин ҷо сарчашма. Ва на танҳо маҷмӯи бузурги эвристикӣ бо як қатор if's вуҷуд дорад. Ҳамин тавр, агар шумо якчанд моҳ барои таҳсил дошта бошед, шумо метавонед кӯшиш кунед, ки меъмориро бифаҳмед.
Оё он самаранок кор мекунад? Хеле самаранок. Мутаассифона, инро исбот кардан душвор аст. Ман танҳо гуфта метавонам, ки агар шумо ҳазорон дархостҳоеро, ки дар замимаҳои калон мавҷуданд, баррасӣ кунед, пас онҳо ба ҳисоби миёна нисбат ба саволҳои таҳиягари хуб самараноктаранд. Як барномасози аълои SQL метавонад ҳама гуна дархостро ба таври муассиртар нависад, аммо бо ҳазорҳо дархост ӯ барои иҷрои ин кор ҳавасмандӣ ва вақт надорад. Ягона чизе, ки ман ҳоло метавонам ҳамчун далели самаранокӣ зикр кунам, ин аст, ки якчанд лоиҳаҳо дар платформаи дар ин DBMS сохташуда кор мекунанд. Системаҳои ERP, ки дорои ҳазорон функсияҳои гуногуни MATERIALIZED, бо ҳазорон корбарон ва пойгоҳи додаҳои терабайтӣ бо садҳо миллион сабтҳо дар сервери муқаррарии ду протсессор кор мекунанд. Бо вуҷуди ин, ҳар кас метавонад тавассути зеркашӣ самаранокии онро тафтиш / рад кунад платформае ва PostgreSQL, даргиронда сабти дархостҳои SQL ва кӯшиши тағир додани мантиқ ва маълумот дар он ҷо.
Дар мақолаҳои навбатӣ, ман инчунин дар бораи он, ки чӣ гуна шумо метавонед маҳдудиятҳоро дар функсияҳо муқаррар кунед, бо ҷаласаҳои тағирот кор кунед ва ғайра сӯҳбат хоҳам кард.