ማመጣጠን በመረጃ ቋቱ ውስጥ ይጽፋል እና ያነባል።

ማመጣጠን በመረጃ ቋቱ ውስጥ ይጽፋል እና ያነባል።
በቀደመው ጽሑፍ በተግባራቶች ላይ የተመሰረተ የውሂብ ጎታ ጽንሰ-ሀሳብ እና አተገባበርን ገለጽኩ, ይልቁንም በተዛማጅ የውሂብ ጎታዎች ውስጥ ከጠረጴዛዎች እና መስኮች ይልቅ. የዚህ አሰራር ከጥንታዊው ይልቅ ያለውን ጥቅም የሚያሳዩ ብዙ ምሳሌዎችን ሰጥቷል። ብዙዎች በበቂ ሁኔታ አሳማኝ እንዳልሆኑ ተገንዝበዋል።

በዚህ ጽሑፍ ውስጥ, ይህ ጽንሰ-ሐሳብ በአሠራር አመክንዮ ላይ ምንም ለውጥ ሳይኖር ወደ ዳታቤዝ መጻፍ እና ማንበብ በፍጥነት እና በተመጣጣኝ ሚዛን እንዴት እንደሚፈቅድ አሳይሻለሁ. ተመሳሳይ ተግባር በዘመናዊ የንግድ ዲቢኤምኤስ (በተለይ፣ 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);

ይህንን ጥያቄ በማንኛውም ዲቢኤምኤስ የማስፈጸም ውስብስብነት ከዚህ ጋር እኩል ይሆናል። ኦ (የሰራተኞች ብዛት)ምክንያቱም ይህ ስሌት ሙሉውን የሰራተኞች ሰንጠረዥ መቃኘት እና ከዚያም በክፍል መቧደን ይጠይቃል። በተመረጠው እቅድ መሰረት ትንሽ (ከዲፓርትመንቶች የበለጠ ብዙ ሰራተኞች እንዳሉ እናምናለን) ማሟያም ይኖራል ኦ(የሰራተኞች ብዛት) ወይም ኦ(የክፍል ብዛት) ለቡድን እና ወዘተ.

በተለያዩ ዲቢኤምኤስ ውስጥ የማስፈጸሚያው በላይ ሊሆን እንደሚችል ግልጽ ነው, ነገር ግን ውስብስብነቱ በምንም መልኩ አይለወጥም.

በታቀደው ትግበራ፣ ተግባራዊ የሆነው ዲቢኤምኤስ ለመምሪያው የሚያስፈልጉትን እሴቶች የሚያሰላ አንድ ንዑስ መጠይቅ ያመነጫል እና ስሙን ለማግኘት ከመምሪያው ሠንጠረዥ ጋር ይቀላቀሉ። ነገር ግን፣ ለእያንዳንዱ ተግባር፣ ሲገልጹ፣ ልዩ ማቴሪያላይዝድ ማርከር ማዘጋጀት ይቻላል። ስርዓቱ ለእያንዳንዱ እንደዚህ አይነት ተግባር ተጓዳኝ መስክን በራስ-ሰር ይፈጥራል። የአንድ ተግባር እሴት ሲቀይሩ የመስክ ዋጋ በተመሳሳይ ግብይት ውስጥ ይለወጣል። ይህንን ተግባር በሚደርሱበት ጊዜ አስቀድሞ የተሰላው መስክ ይደርሳል።

በተለይም MATERIALIZEDን ለተግባር ካዋቀሩ ቆጠራ ሰራተኞች и ደመወዝ ድምር, ከዚያም ሁለት መስኮች ከዲፓርትመንቶች ዝርዝር ጋር ወደ ጠረጴዛው ውስጥ ይጨምራሉ, ይህም የሰራተኞችን ብዛት እና አጠቃላይ ደመወዛቸውን ያከማቻል. በሠራተኞች ፣ በደመወዛቸው ወይም በመምሪያው ትስስር ላይ ለውጥ በሚኖርበት ጊዜ ስርዓቱ የእነዚህን መስኮች እሴቶች በራስ-ሰር ይለውጣል። ከላይ ያለው መጠይቅ በቀጥታ እነዚህን መስኮች ይደርሳል እና ወደ ውስጥ ይከናወናል ኦ(የክፍል ብዛት).

ገደቦች ምንድን ናቸው? አንድ ነገር ብቻ: እንዲህ ዓይነቱ ተግባር እሴቱ የሚገለጽበት የተወሰነ የግቤት እሴቶች ብዛት ሊኖረው ይገባል። ያለበለዚያ ፣ ማለቂያ የሌለው የረድፎች ብዛት ያለው ጠረጴዛ ሊኖር ስለማይችል ሁሉንም እሴቶቹን የሚያከማች ጠረጴዛ መገንባት የማይቻል ነው።

ለምሳሌ:

employeesCount â€˜ĐšĐžĐťĐ¸Ń‡ĐľŃŃ‚вО ŃĐžŃ‚Ń€ŃƒĐ´Đ˝Đ¸ĐşĐžĐ˛ Ń ĐˇĐ°Ń€ĐżĐťĐ°Ń‚ОК > N’ (Department d, NUMERIC[10,2] N) = 
    GROUP SUM salary(Employee e) IF department(e) = d AND salary(e) > N;

ይህ ተግባር ላልተወሰነ የ N እሴቶች ብዛት ይገለጻል (ለምሳሌ ፣ ማንኛውም አሉታዊ እሴት ተስማሚ ነው)። ስለዚህ፣ MATERIALIZED በላዩ ላይ ማስቀመጥ አይችሉም። ስለዚህ ይህ የሎጂክ ገደብ እንጂ ቴክኒካዊ አይደለም (ይህም ተግባራዊ ማድረግ ስላልቻልን አይደለም)። አለበለዚያ, ምንም ገደቦች የሉም. ማቧደን፣ መደርደር፣ AND እና OR፣ 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;

አንድ ተግባር ሲደውሉ ቀን ለትዕዛዝ መስመር, ኢንዴክስ ያለበት መስክ ከጠረጴዛው ላይ ከትዕዛዝ መስመሮች ጋር ይነበባል. የትዕዛዝ ቀኑ ሲቀየር ስርዓቱ ራሱ በመስመሩ ውስጥ ያለውን መደበኛ ያልሆነውን ቀን በራስ-ሰር ያሰላል።

ጥቅሞች

ይህ አጠቃላይ ዘዴ ምንድነው? በጥንታዊ ዲቢኤምኤስ ውስጥ፣ መጠይቆችን እንደገና ሳይጽፉ፣ ገንቢ ወይም DBA ኢንዴክሶችን ብቻ መለወጥ፣ ስታቲስቲክስን ሊወስኑ እና ለመጠይቁ እቅድ አውጪው እንዴት እነሱን እንደሚፈጽም መንገር ይችላሉ (እና HINTዎች በንግድ DBMSዎች ውስጥ ብቻ ይገኛሉ)። ምንም ያህል ቢሞክሩ፣ በጽሁፉ ውስጥ የመጀመሪያውን ጥያቄ ማጠናቀቅ አይችሉም ኦ (የክፍል ብዛት) ጥያቄዎችን ሳይቀይሩ ወይም ቀስቅሴዎችን ሳይጨምሩ. በታቀደው እቅድ ውስጥ, በእድገት ደረጃ ላይ ስለ የውሂብ ማከማቻ አወቃቀሩ እና የትኞቹ ስብስቦች እንደሚጠቀሙ ማሰብ የለብዎትም. ይህ ሁሉ በበረራ ላይ በቀላሉ ሊለወጥ ይችላል, በቀጥታ በእንቅስቃሴ ላይ.

በተግባር ይህን ይመስላል። አንዳንድ ሰዎች በተያዘው ተግባር ላይ በመመስረት ሎጂክን በቀጥታ ያዳብራሉ። ስልተ ቀመሮችን እና ውስብስብነታቸውን፣ ወይም የማስፈጸሚያ ዕቅዶችን፣ ወይም የመቀላቀል ዓይነቶችን፣ ወይም ሌላ ቴክኒካል ክፍሎችን አይረዱም። እነዚህ ሰዎች ከገንቢዎች የበለጠ የንግድ ተንታኞች ናቸው። ከዚያ ይህ ሁሉ ወደ ሙከራ ወይም ክወና ይሄዳል። የረዥም ጊዜ መጠይቆችን መመዝገብን ያስችላል። ረጅም መጠይቅ ሲገኝ፣ ሌሎች ሰዎች (የበለጠ ቴክኒካል - በመሠረቱ DBA) በተወሰነ መካከለኛ ተግባር ላይ MATERIALIZEDን ለማንቃት ይወስናሉ። ይህ ቀረጻውን ትንሽ ይቀንሳል (በግብይቱ ውስጥ ተጨማሪ መስክ ማዘመን ስለሚያስፈልገው)። ነገር ግን, ይህ መጠይቅ በከፍተኛ ፍጥነት የተፋጠነ ብቻ ሳይሆን, ይህንን ተግባር የሚጠቀሙ ሌሎችም ጭምር ነው. በተመሳሳይ ጊዜ, የትኛው ተግባር ተግባራዊ እንደሚሆን መወሰን በአንጻራዊነት ቀላል ነው. ሁለት ዋና መለኪያዎች-የሚቻሉት የግቤት ዋጋዎች ብዛት (ይህ በተዛማጅ ሠንጠረዥ ውስጥ ምን ያህል መዝገቦች እንደሚኖሩ ነው) እና በሌሎች ተግባራት ውስጥ ምን ያህል ጊዜ ጥቅም ላይ ይውላል።

የማመሳሰል

ዘመናዊ የንግድ ዲቢኤምኤስ ተመሳሳይ ስልቶች አሏቸው፡- ማቴሪያላይዝድ እይታ በፈጣን ማደስ (ኦራክል) እና ኢንዴክሰድ እይታ (ማይክሮሶፍት SQL አገልጋይ)። በ PostgreSQL፣ MATERIALIZED 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 በቁሳቁስ በተሰራ የእይታ ምዝግብ ማስታወሻ የማጣሪያ አምዶች ውስጥ ያለው የውሂብ አይነት፣ የዋናው ጣቢያ የቁምፊ ስብስቦች እና በቁሳቁስ የተሠራው እይታ ተመሳሳይ መሆን አለበት።
  • በቁሳቁስ የተደረገው እይታ ከሚከተሉት ውስጥ አንዱ ካለው፣ ፈጣን ማደስ የሚደገፈው በተለመደው የዲኤምኤል ማስገቢያዎች እና ቀጥታ ጭነቶች ላይ ብቻ ነው።
    • ቁሳዊ እይታዎች ከ ጋር MIN or MAX ድምር።
    • ያላቸው ቁሳዊ እይታዎች SUM(expr) ግን አይሆንም COUNT(expr)
    • ያለ ቁሳዊ እይታዎች COUNT(*)

    እንዲህ ዓይነቱ በቁሳቁስ የተሠራ እይታ ማስገቢያ-ብቻ ቁሳዊ እይታ ይባላል።

  • በቁሳቁስ የተሞላ እይታ MAX or MIN ከዲኤምኤል መግለጫዎች ከተሰረዘ ወይም ከተደባለቀ በኋላ በፍጥነት የሚታደስ ነው። WHERE አንቀጽ.
    ዲኤምኤል ከተሰረዘ ወይም ከተቀላቀለ በኋላ ያለው ከፍተኛ/ደቂቃ ፈጣን እድሳት ከማስገቢያ-ብቻ መያዣ ጋር ተመሳሳይ ባህሪ የለውም። ለተጎዱ ቡድኖች ከፍተኛውን/ደቂቃን ይሰርዛል እና ያሰላል። የእሱን የአፈፃፀም ተፅእኖ ማወቅ አለብዎት.
  • በተሰየሙ እይታዎች ወይም ንዑስ መጠይቆች ውስጥ ቁሳዊ እይታዎች FROM እይታዎች ሙሉ በሙሉ ከተዋሃዱ አንቀጽ በፍጥነት ማደስ ይቻላል። የትኞቹ እይታዎች እንደሚዋሃዱ መረጃ ለማግኘት ይመልከቱ Oracle የውሂብ ጎታ SQL የቋንቋ ማጣቀሻ.
  • የውጪ መጋጠሚያዎች ከሌሉ በዘፈቀደ ምርጫዎች እና መቀላቀል ሊኖርዎት ይችላል። WHERE አንቀጽ.
  • ውጫዊ ማያያዣዎች ያሉት ቁሳዊ ድምር እይታዎች ከተለመደው ዲኤምኤል እና ቀጥታ ጭነቶች በኋላ በፍጥነት የሚታደሱ ናቸው፣ ውጫዊው ጠረጴዛ ብቻ ከተሻሻለ። እንዲሁም በውስጠኛው መጋጠሚያ ጠረጴዛው መጋጠሚያ አምዶች ላይ ልዩ ገደቦች መኖር አለባቸው። የውጭ መጋጠሚያዎች ካሉ, ሁሉም መጋጠሚያዎች በ መያያዝ አለባቸው 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 ኦፕሬተር በንዑስ መጠይቅ ውስጥ ሊካተት አይችልም፣ ከአንድ በስተቀር፡ የ UNION ALL ውስጥ subquery ውስጥ ሊሆን ይችላል FROM አንቀጽ የሚገልጽ ጥያቄ ቅጹ ከሆነ SELECT * FROM (ይመልከቱ ወይም ይግዙ በ UNION ALL) በሚከተለው ምሳሌ፡-

    እይታን ፍጠር_unionall AS (ይምረጡ c.rowid crid፣ c.cust_id፣ 2 umarker ከደንበኞች c WHERE c.cust_last_name = 'ስሚዝ' UNION ሁሉንም ይምረጡ c.rowid crid, c.cust_id, 3 umarker ከደንበኞች ሐ = የት c.cust_last_last_name "ጆንስ"); ቁሳዊ የሆነ እይታ ፍጠር ሁሉም_ውስጥ_ዕይታ_ኤምቪ እንደ መረጣ በፍላጎት በፍጥነት አድስ * ከእይታ_ከሁሉም_ጋር;
    

    እይታው መሆኑን ልብ ይበሉ view_with_unionall በፍጥነት ለማደስ የሚያስፈልጉትን መስፈርቶች ያሟላል።

  • በ ውስጥ እያንዳንዱ የጥያቄ እገዳ UNION ALL መጠይቁ ፈጣን የሚታደስ ቁሳዊ እይታን በድምር ወይም በፍጥነት የሚታደስ ቁሳቁሳዊ እይታን በመገጣጠም ማሟላት አለበት።

    ለተዛማጅ ፈጣን ታዳሽ ቁሳዊ እይታ እንደ አስፈላጊነቱ ተገቢው በቁሳቁስ የተሰሩ የእይታ ምዝግቦች በጠረጴዛዎች ላይ መፈጠር አለባቸው።
    የ Oracle ዳታቤዝ ልዩ ሁኔታን የሚፈቅደው ነጠላ ሠንጠረዥ ተጨባጭ እይታ ብቻ ሲሆን ከተቀላቀሉት ጋር ብቻ ነው። ROWID አምድ በ ውስጥ ተካቷል SELECT ዝርዝር እና በቁሳዊ እይታ መዝገብ ውስጥ. ይህ በአመለካከት ፍቺ ጥያቄ ውስጥ ይታያል view_with_unionall.

  • የ SELECT የእያንዳንዱ መጠይቅ ዝርዝር ሀ ማካተት አለበት። UNION ALL ምልክት ማድረጊያ, እና UNION ALL አምድ በእያንዳንዱ ውስጥ የተለየ ቋሚ የቁጥር ወይም የሕብረቁምፊ እሴት ሊኖረው ይገባል። UNION ALL ቅርንጫፍ. በተጨማሪም ፣ የአመልካች አምድ በ ውስጥ በተመሳሳይ መደበኛ ቦታ ላይ መታየት አለበት። SELECT የእያንዳንዱ መጠይቅ እገዳ ዝርዝር. ተመልከት"UNION ALL ማርከር እና መጠይቅ እንደገና ይፃፉ» ለበለጠ መረጃ UNION ALL አመልካቾች
  • እንደ ውጫዊ መጋጠሚያዎች፣ የማስገባት-ብቻ ድምር ቁስ የእይታ መጠይቆች እና የርቀት ሰንጠረዦች ያሉ አንዳንድ ባህሪያት ለቁሳዊ እይታዎች አይደገፉም በ UNION ALL. ነገር ግን በማባዛት ውስጥ ጥቅም ላይ የዋሉ ተጨባጭ ዕይታዎች መጋጠሚያዎች ወይም ውህዶች የሌላቸው ሲሆኑ፣ በፍጥነት ሊታደሱ እንደሚችሉ ልብ ይበሉ። UNION ALL ወይም የርቀት ጠረጴዛዎች ጥቅም ላይ ይውላሉ.
  • ፈጣን የሚታደስ ቁሳዊ እይታ ለመፍጠር የተኳኋኝነት ማስጀመሪያ መለኪያው ወደ 9.2.0 ወይም ከዚያ በላይ መዋቀር አለበት። UNION ALL.

የ Oracle አድናቂዎችን ማሰናከል አልፈልግም, ነገር ግን በእገዳዎቻቸው ዝርዝር ውስጥ, ይህ ዘዴ በአጠቃላይ ሁኔታ ውስጥ የተጻፈ ይመስላል, አንድ ዓይነት ሞዴል በመጠቀም, ነገር ግን በሺዎች በሚቆጠሩ ህንዶች, ሁሉም ሰው እድል ተሰጥቶታል. የራሳቸውን ቅርንጫፍ ጽፈው እያንዳንዳቸው የሚችሉትን አደረጉ፤ አደረጉም። ይህንን ዘዴ ለትክክለኛ አመክንዮ መጠቀም በማዕድን ውስጥ እንደ መሄድ ነው። ግልጽ ካልሆኑ ገደቦች ውስጥ አንዱን በመምታት በማንኛውም ጊዜ ማዕድን ማግኘት ይችላሉ። እንዴት እንደሚሰራ ደግሞ የተለየ ጥያቄ ነው, ነገር ግን ከዚህ ጽሑፍ ወሰን በላይ ነው.

Microsoft SQL Server

ተጨማሪ መስፈርቶች

ከ SET አማራጮች እና የመወሰን ተግባር መስፈርቶች በተጨማሪ የሚከተሉት መስፈርቶች መሟላት አለባቸው።

  • የሚያከናውነው ተጠቃሚ CREATE INDEX የአመለካከት ባለቤት መሆን አለበት.
  • መረጃ ጠቋሚውን ሲፈጥሩ, የ IGNORE_DUP_KEY አማራጭ ወደ ጠፍቷል (ነባሪው መቼት) መቀናበር አለበት።
  • ሰንጠረዦች በሁለት-ክፍል ስሞች መጠቆም አለባቸው, ዘዴ.የጠረጴዛ ስም በአመለካከት ትርጉም.
  • በእይታ ውስጥ የተጠቀሱ በተጠቃሚ የተገለጹ ተግባራት መፈጠር አለባቸው WITH SCHEMABINDING አማራጭ.
  • በእይታ ውስጥ የተጠቀሱ ማንኛቸውም በተጠቃሚ የተገለጹ ተግባራት በሁለት ክፍል ስሞች መጠቆም አለባቸው፣ ..
  • በተጠቃሚ የተገለጸ ተግባር የውሂብ መዳረሻ ንብረት መሆን አለበት። NO SQL, እና የውጭ መዳረሻ ንብረት መሆን አለበት NO.
  • የጋራ ቋንቋ የሩጫ ጊዜ (CLR) ተግባራት በእይታ ምረጥ ዝርዝር ውስጥ ሊታዩ ይችላሉ፣ ነገር ግን የተሰባሰበው የመረጃ ጠቋሚ ቁልፍ ፍቺ አካል ሊሆኑ አይችሉም። የ CLR ተግባራት እይታ WHERE አንቀጽ ወይም የ JOIN ክወና በእይታ ላይ ባለው አንቀጽ ውስጥ ሊታዩ አይችሉም።
  • የ CLR ተግባራት እና የ CLR በተጠቃሚ የተገለጹ አይነቶች በእይታ ፍቺ ውስጥ ጥቅም ላይ የሚውሉ ስልቶች በሚከተለው ሠንጠረዥ ላይ እንደሚታየው የተቀመጡ ንብረቶች ሊኖራቸው ይገባል።

    ንብረት
    ማስታወሻ

    ቆራጥ = እውነት
    እንደ Microsoft .NET Framework ዘዴ ባህሪ በግልፅ መታወቅ አለበት።

    ትክክለኛ = እውነት
    እንደ የ.NET Framework ዘዴ ባህሪ በግልፅ መታወጅ አለበት።

    የውሂብ መዳረሻ = ምንም SQL
    የDataAccess አይነታን ወደ DataAccessKind.None እና SystemDataAccess ባህሪ የSystemDataAccessKind.None በማቀናበር የሚወሰን ነው።

    የውጭ መዳረሻ = አይ
    ይህ ንብረት ለ CLR ልማዶች ነባሪው NO ነው።

  • እይታውን በመጠቀም መፈጠር አለበት WITH SCHEMABINDING አማራጭ.
  • እይታው ከእይታ ጋር በተመሳሳይ የውሂብ ጎታ ውስጥ ያሉትን የመሠረት ሠንጠረዦችን ብቻ ማጣቀስ አለበት። እይታው ሌሎች እይታዎችን ሊያመለክት አይችልም።
  • በእይታ ትርጉሙ ውስጥ ያለው የ SELECT መግለጫ የሚከተሉትን የ Transact-SQL አባሎችን መያዝ የለበትም።

    COUNT
    ROWSET ተግባራት (OPENDATASOURCE, OPENQUERY, OPENROWSET፣ እና OPENXML)
    OUTER ይቀላቀላል (LEFT, RIGHT, ወይም FULL)

    የተገኘ ሠንጠረዥ (ሀ በመጥቀስ ይገለጻል SELECT ውስጥ መግለጫ FROM አንቀጽ)
    ራስን መቀላቀል
    በመጠቀም ዓምዶችን መግለጽ SELECT * or SELECT <table_name>.*

    DISTINCT
    STDEV, STDEVP, VAR, VARP, ወይም AVG
    የጋራ ሰንጠረዥ አገላለጽ (ሲቲኢ)

    ተንሳፈፈ1, ጽሑፍ, ጽሑፍ, ምስል, 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 አለ፣ የእይታ ትርጓሜው መያዝ አለበት። COUNT_BIG(*) እና መያዝ የለበትም HAVING. እነዚህ GROUP BY እገዳዎች የሚተገበሩት በመረጃ ጠቋሚ የእይታ ፍቺ ላይ ብቻ ነው። መጠይቅ እነዚህን ባያረካም በአፈፃፀሙ እቅዱ ውስጥ የተጠቆመ እይታን መጠቀም ይችላል። GROUP BY ገደቦች.
  • የእይታ ትርጉሙ ሀ GROUP BY አንቀጽ፣ የልዩ ክላስተር መረጃ ጠቋሚ ቁልፍ በ ውስጥ የተገለጹትን አምዶች ብቻ ሊያመለክት ይችላል። GROUP BY አንቀጽ.

እዚህ ላይ ሕንዶች “ትንሽ እናደርጋለን ነገር ግን ጥሩ” በሚለው ዕቅድ መሠረት ለማድረግ ስለወሰኑ ሕንዶቹ እንዳልተሳተፉ ግልጽ ነው። ማለትም በሜዳው ላይ ብዙ ፈንጂዎች አሏቸው፣ ነገር ግን ቦታቸው የበለጠ ግልፅ ነው። በጣም የሚያሳዝነው ይህ ገደብ ነው፡-

እይታው ከእይታ ጋር በተመሳሳይ የውሂብ ጎታ ውስጥ ያሉትን የመሠረት ሠንጠረዦችን ብቻ ማጣቀስ አለበት። እይታው ሌሎች እይታዎችን ሊያመለክት አይችልም።

በእኛ የቃላት አገባብ፣ ይህ ማለት አንድ ተግባር ሌላ ቁሳዊ ተግባርን ማግኘት አይችልም ማለት ነው። ይህ በቡቃው ውስጥ ያሉትን ሁሉንም ርዕዮተ ዓለም ይቆርጣል።
እንዲሁም፣ ይህ ገደብ (እና በጽሁፉ ውስጥ) የአጠቃቀም ጉዳዮችን በእጅጉ ይቀንሳል፡-

በእይታ ትርጉሙ ውስጥ ያለው የ SELECT መግለጫ የሚከተሉትን የ Transact-SQL አባሎችን መያዝ የለበትም።

COUNT
ROWSET ተግባራት (OPENDATASOURCE, OPENQUERY, OPENROWSET፣ እና OPENXML)
OUTER ይቀላቀላል (LEFT, RIGHT, ወይም FULL)

የተገኘ ሠንጠረዥ (ሀ በመጥቀስ ይገለጻል SELECT ውስጥ መግለጫ FROM አንቀጽ)
ራስን መቀላቀል
በመጠቀም ዓምዶችን መግለጽ SELECT * or SELECT <table_name>.*

DISTINCT
STDEV, STDEVP, VAR, VARP, ወይም AVG
የጋራ ሰንጠረዥ አገላለጽ (ሲቲኢ)

ተንሳፈፈ1, ጽሑፍ, ጽሑፍ, ምስል, 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 vs አንዳቸውም (ከአንዱ ምክንያታዊ ካልሆነ በስተቀር)። ነገር ግን ይህንን ዘዴ በግንኙነት አመክንዮ መተግበር ከተገለፀው ተግባራዊ ሎጂክ ይልቅ በተወሰነ ደረጃ ከባድ መሆኑን ልብ ሊባል ይገባል።

ትግበራ

እንዴት እንደሚሰራ? PostgreSQL እንደ "ምናባዊ ማሽን" ጥቅም ላይ ይውላል. ጥያቄዎችን የሚገነባ ውስብስብ አልጎሪዝም አለ። እዚህ ምንጭ. እና ትልቅ የሂዩሪስቲክስ ስብስብ ብቻ አይደለም ከቁጥቋጦዎች ጋር። ስለዚህ፣ ለማጥናት ሁለት ወራት ካለህ፣ አርክቴክቸርን ለመረዳት መሞከር ትችላለህ።

ውጤታማ በሆነ መልኩ ይሰራል? በጣም ውጤታማ። በሚያሳዝን ሁኔታ, ይህ ለማረጋገጥ አስቸጋሪ ነው. በትላልቅ አፕሊኬሽኖች ውስጥ ያሉትን በሺዎች የሚቆጠሩ ጥያቄዎችን ከግምት ውስጥ ካስገባህ በአማካይ እነሱ ከጥሩ ገንቢዎች የበለጠ ቀልጣፋ ናቸው ማለት እችላለሁ። እጅግ በጣም ጥሩ የ SQL ፕሮግራም አድራጊ ማንኛውንም ጥያቄ በብቃት መፃፍ ይችላል ፣ ግን በሺህ መጠይቆች እሱ በቀላሉ ለመስራት ተነሳሽነት ወይም ጊዜ አይኖረውም። አሁን እንደ ውጤታማነት ማረጋገጫ የምጠቅሰው ብቸኛው ነገር በዚህ ዲቢኤምኤስ ላይ በተገነባው መድረክ ላይ በርካታ ፕሮጀክቶች እየሰሩ ነው የኢአርፒ ስርዓቶችበሺዎች የሚቆጠሩ የተለያዩ ማቴሪያላይዜድ ተግባራት ያሉት፣ በሺዎች የሚቆጠሩ ተጠቃሚዎች እና የቴራባይት ዳታቤዝ በመደበኛ ሁለት ፕሮሰሰር ሰርቨር ላይ የሚሰሩ በመቶ ሚሊዮኖች የሚቆጠሩ መዝገቦች ያሉት። ሆኖም ማንም ሰው በማውረድ ውጤታማነቱን ማረጋገጥ/መቃወም ይችላል። መድረክ እና PostgreSQL፣ በማብራት ላይ የ SQL መጠይቆችን ማስገባት እና እዚያ ያለውን ሎጂክ እና ውሂብ ለመለወጥ መሞከር.

በሚቀጥሉት መጣጥፎች ውስጥ ፣ በተግባሮች ላይ ገደቦችን እንዴት ማቀናበር እንደሚችሉ ፣ ከለውጥ ክፍለ-ጊዜዎች ጋር ለመስራት እና ሌሎችንም እናገራለሁ ።

ምንጭ: hab.com

አስተያየት ያክሉ