පෙර දී
මෙම ලිපියෙන්, මෙහෙයුම් තර්කනයේ කිසිදු වෙනසක් නොමැතිව දත්ත සමුදායට ලිවීම සහ කියවීම ඉක්මනින් සහ පහසුවෙන් සමතුලිත කිරීමට මෙම සංකල්පය ඔබට ඉඩ සලසන ආකාරය මම පෙන්වන්නම්. නවීන වාණිජ 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 (සේවකයින් සංඛ්යාව)මක්නිසාද යත් මෙම ගණනය කිරීම සඳහා සේවකයින්ගේ මුළු වගුවම පරිලෝකනය කර ඔවුන් දෙපාර්තමේන්තු අනුව කාණ්ඩගත කිරීම අවශ්ය වේ. තෝරාගත් සැලැස්ම අනුව කුඩා (දෙපාර්තමේන්තු වලට වඩා බොහෝ සේවකයින් සිටින බව අපි විශ්වාස කරමු) අතිරේකයක් ද ඇත. O (සේවක ලොග් අංකය) හෝ O (දෙපාර්තමේන්තු ගණන) කණ්ඩායම් කිරීම සහ යනාදිය සඳහා.
විවිධ DBMS වල ක්රියාත්මක කිරීමේ උඩිස් වෙනස් විය හැකි බව පැහැදිලිය, නමුත් සංකීර්ණත්වය කිසිඳු ආකාරයකින් වෙනස් නොවනු ඇත.
යෝජිත ක්රියාත්මක කිරීමේදී, ක්රියාකාරී DBMS විසින් දෙපාර්තමේන්තුවට අවශ්ය අගයන් ගණනය කරන එක් උප විමසුමක් ජනනය කරනු ඇත, පසුව නම ලබා ගැනීම සඳහා දෙපාර්තමේන්තු වගුව සමඟ එක්වන්න. කෙසේ වෙතත්, එක් එක් කාර්යය සඳහා, ප්රකාශ කරන විට, විශේෂ ද්රව්යමය සලකුණක් සැකසීමට හැකි වේ. එවැනි එක් එක් කාර්යය සඳහා පද්ධතිය ස්වයංක්රීයව අනුරූප ක්ෂේත්රයක් සාදනු ඇත. ශ්රිතයක අගය වෙනස් කිරීමේදී එම ගනුදෙනුවේදීම ක්ෂේත්රයේ අගයද වෙනස් වේ. මෙම කාර්යයට ප්රවේශ වන විට, පෙර ගණනය කළ ක්ෂේත්රයට ප්රවේශ වනු ඇත.
විශේෂයෙන්ම, ඔබ ශ්රිත සඳහා MATERIALIZED සකසන්නේ නම් ගණන් සේවකයන් и වැටුප් එකතුව, ඉන්පසුව දෙපාර්තමේන්තු ලැයිස්තුව සමඟ ක්ෂේත්ර දෙකක් මේසයට එකතු කරනු ලබන අතර, සේවකයින් සංඛ්යාව සහ ඔවුන්ගේ මුළු වැටුප ගබඩා කරනු ඇත. සේවකයින්, ඔවුන්ගේ වැටුප් හෝ දෙපාර්තමේන්තු අනුබද්ධ වෙනස්කම් ඇති සෑම විටම, පද්ධතිය ස්වයංක්රීයව මෙම ක්ෂේත්රවල අගයන් වෙනස් කරයි. ඉහත විමසුම සෘජුවම මෙම ක්ෂේත්ර වෙත ප්රවේශ වන අතර එය ක්රියාත්මක වනු ඇත O (දෙපාර්තමේන්තු ගණන).
සීමා මොනවාද? එක් දෙයක් පමණි: එවැනි ශ්රිතයකට එහි අගය අර්ථ දක්වා ඇති සීමිත ආදාන අගයන් තිබිය යුතුය. එසේ නොමැති නම්, පේළි අනන්ත සංඛ්යාවක් සහිත වගුවක් තිබිය නොහැකි බැවින්, එහි සියලු අගයන් ගබඩා කරන වගුවක් තැනීමට නොහැකි වනු ඇත.
උදාහරණ:
employeesCount ‘Количество сотрудников с зарплатой > N’ (Department d, NUMERIC[10,2] N) =
GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;
මෙම ශ්රිතය N හි අසීමිත අගයන් සඳහා අර්ථ දක්වා ඇත (උදාහරණයක් ලෙස, ඕනෑම සෘණ අගයක් සුදුසු වේ). ඒ නිසා ඒකට MATERIALIZED දාන්න බෑ. එබැවින් මෙය තාර්කික සීමාවක් මිස තාක්ෂණික එකක් නොවේ (එනම්, අපට එය ක්රියාත්මක කිරීමට නොහැකි වූ නිසා නොවේ). එසේ නොමැති නම්, සීමාවන් නොමැත. ඔබට සමූහගත කිරීම්, වර්ග කිරීම, සහ සහ හෝ, කොටස, පුනරාවර්තනය, ආදිය භාවිතා කළ හැක.
උදාහරණයක් ලෙස, පෙර ලිපියේ 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;
කාර්යය සඳහා සිට දෙමාපියන් 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 වල පමණි). ඔවුන් කොතරම් උත්සාහ කළත්, ලිපියේ පළමු විමසුම සම්පූර්ණ කිරීමට ඔවුන්ට නොහැකි වනු ඇත O (දෙපාර්තමේන්තු ගණන) විමසුම් වෙනස් කිරීම හෝ ප්රේරක එකතු කිරීමකින් තොරව. යෝජිත යෝජනා ක්රමය තුළ, සංවර්ධන අදියරේදී ඔබ දත්ත ගබඩා කිරීමේ ව්යුහය සහ කුමන එකතු කිරීම් භාවිතා කළ යුතුද යන්න ගැන සිතා බැලිය යුතු නැත. මේ සියල්ල සෘජුවම ක්රියාත්මක වන විට පියාසර කිරීමේදී පහසුවෙන් වෙනස් කළ හැකිය.
ප්රායෝගිකව එය මේ ආකාරයෙන් පෙනේ. සමහර අය ලොජික් ඩිවලොප් කරන්නේ කෙලින්ම කර්තව්යය මතයි. ඔවුන් ඇල්ගොරිතම සහ ඒවායේ සංකීර්ණත්වය, ක්රියාත්මක කිරීමේ සැලසුම්, හෝ සම්බන්ධක වර්ග හෝ වෙනත් තාක්ෂණික සංරචක තේරුම් නොගනිති. මෙම පුද්ගලයින් සංවර්ධකයින්ට වඩා ව්යාපාර විශ්ලේෂකයින් වේ. ඉන්පසුව, මේ සියල්ල පරීක්ෂණයට හෝ මෙහෙයුමට යයි. දිගුකාලීන විමසුම් ලොග් වීම සබල කරයි. දිගු විමසුමක් අනාවරණය වූ විට, වෙනත් පුද්ගලයින් (වඩා තාක්ෂණික - අත්යවශ්යයෙන්ම DBA) සමහර අතරමැදි ශ්රිතයක් මත MATERIALIZED සක්රීය කිරීමට තීරණය කරයි. මෙය පටිගත කිරීම ටිකක් මන්දගාමී කරයි (එය ගනුදෙනුවේ අතිරේක ක්ෂේත්රයක් යාවත්කාලීන කිරීමට අවශ්ය බැවින්). කෙසේ වෙතත්, මෙම විමසුම පමණක් සැලකිය යුතු ලෙස වේගවත් කර ඇත, නමුත් මෙම කාර්යය භාවිතා කරන අනෙකුත් සියලුම. ඒ අතරම, කුමන කාර්යයක් ඉටු කළ යුතුද යන්න තීරණය කිරීම සාපේක්ෂව පහසුය. ප්රධාන පරාමිතීන් දෙකක්: හැකි ආදාන අගයන් ගණන (අනුරූප වගුවේ වාර්තා කීයක් තිබේද යන්න මෙයයි), සහ එය වෙනත් කාර්යයන් සඳහා කොපමණ වාරයක් භාවිතා කරන්නේද යන්න.
ප්රතිසම
නවීන වාණිජ DBMS වලට සමාන යාන්ත්රණ ඇත: වේගවත් REFRESH (Oracle) සහ INDEXED VIEW (Microsoft SQL Server) සහිත MATERIALIZED VIEW. PostgreSQL හි, MATERIALIZED VIEW ගණුදෙනුවකදී යාවත්කාලීන කළ නොහැක, නමුත් ඉල්ලීම මත පමණක් (සහ ඉතා දැඩි සීමා සහිතව වුවද), එබැවින් අපි එය නොසලකමු. නමුත් ඒවායේ භාවිතය සැලකිය යුතු ලෙස සීමා කරන ගැටළු කිහිපයක් තිබේ.
පළමුව, ඔබට ද්රව්යකරණය සක්රීය කළ හැක්කේ ඔබ දැනටමත් සාමාන්ය දසුනක් සාදා ඇත්නම් පමණි. එසේ නොමැතිනම්, මෙම ද්රව්යකරණය භාවිතා කිරීම සඳහා අලුතින් සාදන ලද දර්ශනය වෙත ප්රවේශ වීමට ඉතිරි ඉල්ලීම් නැවත ලිවීමට සිදුවනු ඇත. නැතහොත් සෑම දෙයක්ම එලෙසම තබන්න, නමුත් දැනටමත් කලින් ගණනය කර ඇති නිශ්චිත දත්ත තිබේ නම් එය අවම වශයෙන් අකාර්යක්ෂම වනු ඇත, නමුත් බොහෝ විමසුම් සෑම විටම එය භාවිතා නොකරයි, නමුත් එය නැවත ගණනය කරන්න.
දෙවනුව, ඔවුන්ට විශාල සීමාවන් තිබේ:
ඔරකල්
5.3.8.4 වේගවත් නැවුම් කිරීම සඳහා පොදු සීමාවන්
ද්රව්යමය දර්ශනයේ නිර්වචන විමසුම පහත පරිදි සීමා කර ඇත:
- ද්රව්යමය දසුනෙහි පුනරාවර්තනය නොවන ප්රකාශන සඳහා යොමු අඩංගු නොවිය යුතුය
SYSDATE
සහROWNUM
.- ද්රව්යමය දසුනෙහි යොමු අඩංගු නොවිය යුතුය
RAW
orLONG
RAW
දත්ත වර්ග.- එහි a අඩංගු විය නොහැක
SELECT
ලැයිස්තු උප විමසුම.- එහි විශ්ලේෂණාත්මක කාර්යයන් අඩංගු විය නොහැක (උදාහරණයක් ලෙස,
RANK
) තුළSELECT
වගන්තිය.- එයට වගුවක් යොමු කළ නොහැක
XMLIndex
දර්ශකය අර්ථ දක්වා ඇත.- එහි a අඩංගු විය නොහැක
MODEL
වගන්තිය.- එහි a අඩංගු විය නොහැක
HAVING
උප විමසුමක් සහිත වගන්තිය.- එහි ඇති කැදලි විමසුම් අඩංගු විය නොහැක
ANY
,ALL
, හෝNOT
EXISTS
.- එහි a අඩංගු විය නොහැක
[START WITH …] CONNECT BY
වගන්තිය.- එහි විවිධ අඩවි වල විස්තර වගු කිහිපයක් අඩංගු විය නොහැක.
ON
COMMIT
ද්රව්යකරණය වූ දසුන්වලට දුරස්ථ විස්තර වගු තිබිය නොහැක.- කැදලි ද්රව්යකරණය වූ දසුන්වලට එකතුවීමක් හෝ එකතුවක් තිබිය යුතුය.
- a
GROUP
BY
වගන්තිය දර්ශක-සංවිධානාත්මක වගුවකින් තෝරාගත නොහැක.5.3.8.5 එකතුවීම් පමණක් සමඟ ද්රව්යකරණය කළ දසුන් මත වේගවත් නැවුම් කිරීම පිළිබඳ සීමා
එකතු කිරීම් පමණක් සමඟින් ද්රව්යගත බැලීම් සඳහා විමසුම් නිර්වචනය කිරීම සහ වේගවත් නැවුම් කිරීම සඳහා පහත සඳහන් සීමා කිරීම් නොමැත:
- « සිට සියලු සීමා
වේගවත් නැවුම් කිරීම සඳහා පොදු සීමාවන් «.- ඔවුන්ට තිබිය නොහැක
GROUP
BY
වගන්ති හෝ එකතු කිරීම්.- හි ඇති සියලුම වගු වල පේළි
FROM
ලැයිස්තුවේ දිස්විය යුතුයSELECT
විමසුම් ලැයිස්තුව.- ද්රව්යගත දර්ශන ලොග වල ඇති සියලුම පාදක වගු සඳහා rowids සමඟ පැවතිය යුතුය
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))
orAVG(x)
+AVG(x)
අවසර නැත.- වැනි එක් එක් එකතුව සඳහා
AVG(expr)
, අනුරූපCOUNT(expr)
සිටිය යුතුය. Oracle එය නිර්දේශ කරයිSUM(expr)
නිශ්චිතව දක්වා ඇත.- If
VARIANCE(expr)
orSTDDEV(expr
) නිශ්චිතව දක්වා ඇත,COUNT(expr)
සහSUM(expr)
නිශ්චිතව දැක්විය යුතුය. Oracle එය නිර්දේශ කරයිSUM(expr *expr)
නිශ්චිතව දක්වා ඇත.- එම
SELECT
නිර්වචන විමසුමේ තීරු බහු මූලික වගු වලින් තීරු සහිත සංකීර්ණ ප්රකාශනයක් විය නොහැක. මේ සඳහා කළ හැකි විසඳුමක් වන්නේ කැදලි ද්රව්යමය දර්ශනයක් භාවිතා කිරීමයි.- එම
SELECT
ලැයිස්තුවේ සියල්ල අඩංගු විය යුතුයGROUP
BY
තීරු.- ද්රව්යමය දසුන දුරස්ථ වගු එකක් හෝ කිහිපයක් මත පදනම් නොවේ.
- ඔබ භාවිතා කරන්නේ නම් a
CHAR
ද්රව්යමය දර්ශන ලොගයක පෙරහන් තීරුවල දත්ත වර්ගය, ප්රධාන අඩවියේ අක්ෂර කට්ටල සහ ද්රව්යකරණය කළ දසුන සමාන විය යුතුය.- ද්රව්යගත දසුනට පහත ඒවායින් එකක් තිබේ නම්, වේගවත් නැවුම් කිරීම සඳහා සහය දක්වන්නේ සාම්ප්රදායික DML ඇතුළු කිරීම් සහ සෘජු පැටවීම් මත පමණි.
- සමඟ ද්රව්යගත දසුන්
MIN
orMAX
සමස්ථ- ඇති ද්රව්යමය දසුන්
SUM(expr)
නමුත් නැතCOUNT(expr)
- තොරව ද්රව්යමය දසුන්
COUNT(*)
එවැනි ද්රව්යමය දර්ශනයක් ඇතුළත් කිරීම් පමණක් ද්රව්යමය දර්ශනයක් ලෙස හැඳින්වේ.
- සමඟ ද්රව්යකරණය වූ දසුනක්
MAX
orMIN
මකා දැමීමෙන් පසුව හෝ මිශ්ර DML ප්රකාශන නොමැති නම් එය ඉක්මනින් නැවුම් කළ හැකWHERE
වගන්තිය.
මකා දැමීමෙන් පසු උපරිම/විනාඩි වේගවත් නැවුම් කිරීම හෝ මිශ්ර DML ඇතුළු කිරීම-පමණි නඩුවේ හැසිරීම සමාන නොවේ. එය බලපෑමට ලක් වූ කණ්ඩායම් සඳහා උපරිම/මිනි අගයන් මකා නැවත ගණනය කරයි. එහි කාර්ය සාධන බලපෑම පිළිබඳව ඔබ දැනුවත් විය යුතුය.- තුළ නම් කරන ලද දසුන් හෝ උප විමසුම් සහිත ද්රව්යගත දසුන්
FROM
දර්ශන සම්පූර්ණයෙන්ම ඒකාබද්ධ කළ හැකි නම් වගන්තිය ඉක්මනින් නැවුම් කළ හැක. කුමන දර්ශන ඒකාබද්ධ වේද යන්න පිළිබඳ තොරතුරු සඳහා, බලන්නඔරකල් දත්ත සමුදාය SQL භාෂා යොමුව .- බාහිර සම්බන්ධ කිරීම් නොමැති නම්, ඔබට අත්තනෝමතික තේරීම් සහ එකතුවීම් තිබිය හැක
WHERE
වගන්තිය.- සාම්ප්රදායික DML සහ සෘජු පැටවීම් වලින් පසුව බාහිර සම්බන්ධ කිරීම් සහිත ද්රව්යමය සමස්ථ දසුන් වේගයෙන් ප්රබෝධමත් වේ, පිටත වගුව පමණක් වෙනස් කර තිබේ නම්. එසේම, අභ්යන්තර සම්බන්ධ කිරීමේ වගුවේ සම්බන්ධ වීමේ තීරුවල අනන්ය බාධාවන් පැවතිය යුතුය. පිටත සන්ධි තිබේ නම්, සියලු සන්ධි මගින් සම්බන්ධ කළ යුතුය
AND
s සහ සමානාත්මතාවය භාවිතා කළ යුතුය (=
) ක්රියාකරු.- සමඟ ද්රව්යමය අදහස් සඳහා
CUBE
,ROLLUP
, සමූහගත කිරීමේ කට්ටල, හෝ ඒවා ඒකාබද්ධ කිරීම, පහත සීමා කිරීම් අදාළ වේ:
- එම
SELECT
ලැයිස්තුවේ a විය හැකි සමූහගත කිරීමේ විභේදකය අඩංගු විය යුතුය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
set operator support theREFRESH
FAST
පහත කොන්දේසි සපුරා ඇත්නම් විකල්පය:
- නිර්වචන විමසුමේ තිබිය යුතුය
UNION
ALL
ඉහළ මට්ටමේ ක්රියාකරු.එම
UNION
ALL
එක් ව්යතිරේකයක් සහිතව, ක්රියාකරු උප ප්රශ්නාවලියක් තුළට ඇතුළත් කළ නොහැක: TheUNION
ALL
හි උප විමසුමක සිටිය හැකFROM
නිර්වචන විමසුම ආකෘතියෙන් ලබා දී ඇති වගන්තියSELECT * FROM
(බලන්න හෝ උප විමසුම සමඟUNION
ALL
) පහත උදාහරණයේ මෙන්:VIEW view_with_unionall AS (c.rowid crid, c.cust_id, 2 umarker තෝරන්න c. c.cust_last_name = 'Smith' UNION ALL SELECT c.rowid crid, c.cust_id, c.cust_nam පාරිභෝගිකයන්ගෙන් 3ක් 'ජෝන්ස්'); MATERIALIZED VIEW Unionall_inside_view_mv REFRESH ඉල්ලුමට අනුව * සිට view_with_unionall;දර්ශනය බව සලකන්න
view_with_unionall
වේගවත් නැවුම් කිරීම සඳහා අවශ්යතා සපුරාලයි.- එක් එක් විමසුම් වාරණ
UNION
ALL
විමසුම සමස්ථයන් සමඟ වේගවත් නැවුම් කළ හැකි ද්රව්යමය දසුනක අවශ්යතා හෝ සම්බන්ධ කිරීම් සමඟ වේගවත් නැවුම් කළ හැකි ද්රව්යමය දසුනක අවශ්යතා සපුරාලිය යුතුය.අනුරූපී ආකාරයේ වේගවත් නැවුම් කළ හැකි ද්රව්යකරණය කළ දසුන සඳහා අවශ්ය පරිදි සුදුසු ද්රව්යමය දර්ශන ලොග වගු මත නිර්මාණය කළ යුතුය.
Oracle දත්ත සමුදාය මගින් එක් වගුවක විශේෂ අවස්ථාවට ඉඩ ලබා දෙන බව සලකන්න.ROWID
තීරුවේ ඇතුළත් කර ඇතSELECT
ලැයිස්තුව සහ ද්රව්යගත දර්ශන ලොගයේ. මෙය දර්ශනයේ නිර්වචන විමසුමේ දැක්වේview_with_unionall
.- එම
SELECT
එක් එක් විමසුමේ ලැයිස්තුවේ අඩංගු විය යුතුය aUNION
ALL
සලකුණු, සහUNION
ALL
තීරුවෙහි එකිනෙකට වෙනස් නියත සංඛ්යාත්මක හෝ තන්තු අගයක් තිබිය යුතුයUNION
ALL
ශාඛාව. තවද, සලකුණු තීරුව හි එකම සාමාන්ය ස්ථානයේ දිස්විය යුතුයSELECT
එක් එක් විමසුම් වාරණ ලැයිස්තුව. බලන්න"UNION සියලුම මාර්කර් සහ විමසුම් නැවත ලියන්න » සම්බන්ධ වැඩි විස්තර සඳහාUNION
ALL
සලකුණු.- බාහිර සම්බන්ධ කිරීම්, ඇතුළු කිරීමට පමණක් සමස්ථ ද්රව්යකරණය කළ බැලීම් විමසුම් සහ දුරස්ථ වගු වැනි සමහර විශේෂාංග ද්රව්යමය වූ බැලීම් සඳහා සහය නොදක්වයි
UNION
ALL
. කෙසේ වෙතත්, එක්වීම් හෝ එකතු කිරීම් අඩංගු නොවන, අනුවර්තනයේදී භාවිතා කරන ලද ද්රව්යකරණය වූ දසුන් ඉක්මනින් නැවුම් කළ හැකි බව සලකන්නUNION
ALL
හෝ දුරස්ථ වගු භාවිතා වේ.- සමඟ වේගවත් නැවුම් කළ හැකි ද්රව්යමය දසුනක් නිර්මාණය කිරීම සඳහා ගැළපුම් ආරම්භක පරාමිතිය 9.2.0 හෝ ඊට වැඩි ලෙස සැකසිය යුතුය
UNION
ALL
.
මට ඔරකල් රසිකයින් අමනාප කිරීමට අවශ්ය නැත, නමුත් ඔවුන්ගේ සීමාවන් ලැයිස්තුවෙන් විනිශ්චය කරන විට, මෙම යාන්ත්රණය ලියා ඇත්තේ සාමාන්ය නඩුවේදී නොවේ, යම් ආකාරයක ආකෘතියක් භාවිතා කර, නමුත් දහස් ගණනක් ඉන්දියානුවන් විසින්, සෑම කෙනෙකුටම අවස්ථාව ලබා දී ඇති බවයි. ඔවුන්ගේම ශාඛාවක් ලියන්න, ඔවුන් එකිනෙකාට කළ හැකි දේ කළා. සැබෑ තර්කනය සඳහා මෙම යාන්ත්රණය භාවිතා කිරීම බිම් බෝම්බයක් හරහා ගමන් කිරීම වැනි ය. නොපැහැදිලි සීමා වලින් එකකට පහර දීමෙන් ඔබට ඕනෑම වේලාවක පතලක් ලබා ගත හැක. එය ක්රියාත්මක වන ආකාරය ද වෙනම ප්රශ්නයක් වන නමුත් එය මෙම ලිපියේ විෂය පථයෙන් ඔබ්බට ය.
Microsoft SQL සේවාදායකය
අමතර අවශ්යතා
SET විකල්ප සහ අධිෂ්ඨාන ක්රියාකාරී අවශ්යතා වලට අමතරව, පහත අවශ්යතා සපුරාලිය යුතුය:
- ක්රියාත්මක කරන පරිශීලකයා
CREATE INDEX
දර්ශනයේ හිමිකරු විය යුතුය.- ඔබ දර්ශකය නිර්මාණය කරන විට, ද
IGNORE_DUP_KEY
විකල්පය OFF වෙත සැකසිය යුතුය (පෙරනිමි සැකසුම).- වගු කොටස් දෙකක නම් වලින් යොමු කළ යුතුය, සැලැස්ම.වගු නාමය දැක්ම අර්ථ දැක්වීම තුළ.
- දර්ශනයේ සඳහන් පරිශීලක-නිර්වචනය කළ කාර්යයන් නිර්මාණය කළ යුත්තේ භාවිතා කිරීමෙනි
WITH SCHEMABINDING
විකල්පය.- දර්ශනයේ සඳහන් ඕනෑම පරිශීලක-නිර්වචනය කරන ලද කාර්යයන් කොටස් දෙකක නම් වලින් යොමු කළ යුතුය, ..
- පරිශීලක-නිර්වචනය කරන ලද ශ්රිතයක දත්ත ප්රවේශ ගුණය විය යුතුය
NO SQL
, සහ බාහිර ප්රවේශ දේපල විය යුතුයNO
.- පොදු භාෂා ධාවන කාලය (CLR) ශ්රිතයන් දර්ශනයේ තෝරාගත් ලැයිස්තුවේ දිස්විය හැකි නමුත්, පොකුරු දර්ශක යතුරේ අර්ථ දැක්වීමේ කොටසක් විය නොහැක. CLR ශ්රිතයන් දර්ශනයේ WHERE වගන්තියේ හෝ දර්ශනයේ JOIN මෙහෙයුමක ON වගන්තියේ දිස්විය නොහැක.
- CLR කාර්යයන් සහ CLR පරිශීලක-නිර්වචනය කරන ලද වර්ගවල දර්ශන නිර්වචනයේ භාවිතා කරන ක්රම පහත වගුවේ පෙන්වා ඇති පරිදි සකසා ඇති ගුණාංග තිබිය යුතුය.
දේපල
සටහනDETERMINISTIC = සත්ය
Microsoft .NET Framework ක්රමයේ ගුණාංගයක් ලෙස පැහැදිලිව ප්රකාශ කළ යුතුය.PRECISE = සත්ය
.NET Framework ක්රමයේ ගුණාංගයක් ලෙස පැහැදිලිව ප්රකාශ කළ යුතුය.දත්ත ප්රවේශය = SQL නැත
DataAccess ගුණාංගය DataAccessKind.None වෙත සහ SystemDataAccess උපලක්ෂණ SystemDataAccessKind.None වෙත සැකසීමෙන් තීරණය වේ.බාහිර ප්රවේශය = නැත
මෙම දේපල CLR චර්යාවන් සඳහා NO වෙත පෙරනිමි වේ.- දර්ශනය භාවිතා කර නිර්මාණය කළ යුතුය
WITH SCHEMABINDING
විකල්පය.- දසුනට යොමු විය යුත්තේ දසුනට සමාන දත්ත සමුදායේ ඇති මූලික වගු පමණි. දර්ශනයට වෙනත් දසුන් යොමු කළ නොහැක.
- දර්ශන නිර්වචනයේ ඇති SELECT ප්රකාශයේ පහත ගනුදෙනු-SQL මූලද්රව්ය අඩංගු නොවිය යුතුය:
COUNT
ROWSET කාර්යයන් (OPENDATASOURCE
,OPENQUERY
,OPENROWSET
, සහOPENXML
)
OUTER
එකතු වේ (LEFT
,RIGHT
, හෝFULL
)ව්යුත්පන්න වගුව (නිශ්චිතව අර්ථ දක්වා ඇත a
SELECT
හි ප්රකාශයFROM
වගන්තිය)
ස්වයං එකතු වේ
භාවිතා කරමින් තීරු නියම කිරීමSELECT *
orSELECT <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
orCROSS APPLY
PIVOT
,UNPIVOT
විරල තීරු කට්ටල
පේළිගත (TVF) හෝ බහු-ප්රකාශ වගු-වටිනා කාර්යයන් (MSTVF)
OFFSET
CHECKSUM_AGG
1 සුචිගත දසුනේ අඩංගු විය හැක පාවෙන අය තීරු; කෙසේ වෙතත්, එවැනි තීරු පොකුරු දර්ශක යතුරට ඇතුළත් කළ නොහැක.
- If
GROUP BY
පවතී, VIEW අර්ථ දැක්වීමේ අඩංගු විය යුතුයCOUNT_BIG(*)
සහ අඩංගු නොවිය යුතුයHAVING
. මේGROUP BY
සීමා කිරීම් අදාළ වන්නේ සුචිගත දර්ශන නිර්වචනයට පමණි. විමසුමකට මේවා තෘප්තිමත් නොවුනත් එහි ක්රියාත්මක කිරීමේ සැලැස්මේ සුචිගත දසුනක් භාවිතා කළ හැකGROUP BY
සීමා.- දර්ශන නිර්වචනය අඩංගු නම් a
GROUP BY
වගන්තිය, අද්විතීය පොකුරු දර්ශකයේ යතුරට යොමු කළ හැක්කේ එහි දක්වා ඇති තීරු පමණි.GROUP BY
වගන්තිය.
“අපි ටිකක් කරන්නම්, නමුත් හොඳයි” යන යෝජනා ක්රමයට අනුව එය කිරීමට ඔවුන් තීරණය කළ බැවින් ඉන්දියානුවන් සම්බන්ධ නොවූ බව මෙහිදී පැහැදිලිය. එනම්, ඔවුන් ක්ෂේත්රයේ තවත් පතල් ඇත, නමුත් ඔවුන්ගේ ස්ථානය වඩාත් විනිවිද පෙනෙන ය. වඩාත්ම බලාපොරොත්තු සුන් කරවන දෙය නම් මෙම සීමාවයි:
දසුනට යොමු විය යුත්තේ දසුනට සමාන දත්ත සමුදායේ ඇති මූලික වගු පමණි. දර්ශනයට වෙනත් දසුන් යොමු කළ නොහැක.
අපගේ පාරිභාෂිතය තුළ, මෙයින් අදහස් කරන්නේ ශ්රිතයකට වෙනත් ද්රව්යමය ශ්රිතයකට ප්රවේශ විය නොහැකි බවයි. මෙය පොහොට්ටුවේ ඇති සියලුම මතවාදයන් කපා දමයි.
එසේම, මෙම සීමාව (සහ තවදුරටත් පෙළෙහි) භාවිත අවස්ථා බෙහෙවින් අඩු කරයි:
දර්ශන නිර්වචනයේ ඇති SELECT ප්රකාශයේ පහත ගනුදෙනු-SQL මූලද්රව්ය අඩංගු නොවිය යුතුය:
COUNT
ROWSET කාර්යයන් (OPENDATASOURCE
,OPENQUERY
,OPENROWSET
, සහOPENXML
)
OUTER
එකතු වේ (LEFT
,RIGHT
, හෝFULL
)ව්යුත්පන්න වගුව (නිශ්චිතව අර්ථ දක්වා ඇත a
SELECT
හි ප්රකාශයFROM
වගන්තිය)
ස්වයං එකතු වේ
භාවිතා කරමින් තීරු නියම කිරීමSELECT *
orSELECT <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
orCROSS APPLY
PIVOT
,UNPIVOT
විරල තීරු කට්ටල
පේළිගත (TVF) හෝ බහු-ප්රකාශ වගු-වටිනා කාර්යයන් (MSTVF)
OFFSET
CHECKSUM_AGG
OUTER Joins, UNION, Order by සහ වෙනත් අය තහනම්. භාවිතා කළ නොහැකි දේට වඩා භාවිතා කළ හැකි දේ සඳහන් කිරීම පහසු විය හැකිය. ලැයිස්තුව බොහෝ දුරට කුඩා වනු ඇත.
සාරාංශගත කිරීම සඳහා: LGPL තාක්ෂණයේ සෑම (වානිජමය වශයෙන් සටහන් කරමු) DBMS එදිරිව (එක් තාර්කික, තාක්ෂණික නොවන එකක් හැර) විශාල සීමාවන් සමූහයක්. කෙසේ වෙතත්, විස්තර කරන ලද ක්රියාකාරී තර්කනයට වඩා සම්බන්ධතා තර්කනය තුළ මෙම යාන්ත්රණය ක්රියාත්මක කිරීම තරමක් අපහසු බව සැලකිල්ලට ගත යුතුය.
Реализация
එය ක්රියා කරන්නේ කෙසේද? PostgreSQL "අථත්ය යන්ත්රයක්" ලෙස භාවිතා කරයි. විමසුම් ගොඩනඟන සංකීර්ණ ඇල්ගොරිතමයක් ඇතුළත ඇත. මෙතන
එය ඵලදායී ලෙස ක්රියා කරයිද? තරමක් ඵලදායී. අවාසනාවකට, මෙය ඔප්පු කිරීමට අපහසුය. මට කිව හැක්කේ ඔබ විශාල යෙදුම්වල පවතින දහස් ගණන් විමසුම් සලකා බැලුවහොත්, සාමාන්යයෙන් ඒවා හොඳ සංවර්ධකයෙකුට වඩා කාර්යක්ෂම බව පමණි. විශිෂ්ට SQL ක්රමලේඛකයෙකුට ඕනෑම විමසුමක් වඩාත් කාර්යක්ෂමව ලිවිය හැක, නමුත් විමසුම් දහසක් සමඟ ඔහුට එය කිරීමට පෙළඹවීමක් හෝ කාලයක් නොමැත. මට දැන් සඵලතාවයේ සාක්ෂියක් ලෙස දැක්විය හැකි එකම දෙය නම් මෙම DBMS මත ගොඩනගා ඇති වේදිකාවේ ව්යාපෘති කිහිපයක් ක්රියාත්මක වීමයි.
පහත ලිපි වලින්, ඔබට කාර්යයන් සඳහා සීමා පැනවීම, වෙනස් කිරීමේ සැසි සමඟ වැඩ කිරීම සහ තවත් බොහෝ දේ ගැන මම කතා කරමි.
මූලාශ්රය: www.habr.com