विश्लेषणात्मक प्रश्नों के लिए एमडीएक्स बनाम एसक्यूएल का अच्छा उदाहरण


11

क्या कोई मुझे विश्लेषणात्मक प्रश्न करते समय नियमित एसक्यूएल पर एमडीएक्स के फायदे का एक अच्छा उदाहरण दिखा सकता है? मैं एक SQL क्वेरी के साथ MDX क्वेरी की तुलना करना चाहूंगा जो समान परिणाम देता है।

विकिपीडिया कहता है :

हालांकि, इनमें से कुछ को पारंपरिक एसक्यूएल में अनुवाद करना संभव है, फिर भी अक्सर बहुत ही सरल एसक्यूएल अभिव्यक्तियों के लिए अनाड़ी एसक्यूएल अभिव्यक्तियों के संश्लेषण की आवश्यकता होती है।

लेकिन न तो कोई उद्धरण है और न ही उदाहरण। मुझे पूरी तरह से पता है कि अंतर्निहित डेटा को अलग तरीके से व्यवस्थित किया जाना चाहिए, और ओएलएपी को प्रति डाला अधिक प्रसंस्करण और भंडारण की आवश्यकता होगी। (मेरा प्रस्ताव Oracle RDBMS से Apache Kylin + Hadoop में जाने का है )

संदर्भ: मैं अपनी कंपनी को यह समझाने की कोशिश कर रहा हूं कि हमें OLTP डेटाबेस के बजाय OLAP डेटाबेस को क्वेरी करना चाहिए। अधिकांश CRM क्वेरी समूह-प्रकार, सॉर्ट और एकत्रीकरण का भारी उपयोग करती हैं। प्रदर्शन को बढ़ावा देने के अलावा, मुझे लगता है कि OLAP (MDX) क्वेरी समतुल्य OLTP SQL की तुलना में अधिक संक्षिप्त और पढ़ने / लिखने में आसान होगी। एक ठोस उदाहरण बिंदु घर चलाएगा, लेकिन मैं SQL में एक विशेषज्ञ नहीं हूं, बहुत कम MDX ...


यदि यह मदद करता है, तो पिछले सप्ताह हुई फ़ायरवॉल घटनाओं के लिए एक नमूना सिएम-संबंधित SQL क्वेरी है:

SELECT   'Seoul Average' AS term, 
         Substr(To_char(idate, 'HH24:MI'), 0, 4) 
                  || '0'        AS event_time , 
         Round(Avg(tot_accept)) AS cnt 
FROM     ( 
                SELECT                     * 
                FROM   st_event_100_#yyyymm-1m# 
                WHERE  idate BETWEEN trunc(sysdate, 'iw')-7 AND trunc(sysdate, 'iw')-3 #stat_monitor_group_query#
                UNION ALL 
                SELECT * 
                FROM   st_event_100_#yyyymm# 
                WHERE  idate BETWEEN trunc(sysdate, 'iw')-7 AND trunc(sysdate, 'iw')-3 #stat_monitor_group_query# ) pm
GROUP BY substr(to_char(idate, 'HH24:MI'), 0, 4) 
                  || '0' 
UNION ALL 
SELECT   'today' AS term , 
         substr(to_char(idate, 'HH24:MI'), 0, 4) 
                  || '0'        AS event_time , 
         round(avg(tot_accept)) AS cnt 
FROM     st_event_100_#yyyymm# cm 
WHERE    idate >= trunc(sysdate) #stat_monitor_group_query# 
GROUP BY substr(to_char(idate, 'HH24:MI'), 0, 4) 
                  || '0' 
ORDER BY term DESC, 
         event_time ASC

जवाबों:


10

MDXऔर SQL, एक ही है, और अक्सर भी तुलना नहीं कोई रास्ता नहीं में हैं के रूप में वे जानना चाहते हैं multidimensionalऔर relational databasesक्रमशः। आप अपने मौजूदा संबंधपरक डेटाबेस को MDX के साथ क्वेरी नहीं कर सकते।

एक बहुआयामी मॉडल का उपयोग करने और इसे क्वेरी करने के लिए MDX का उपयोग करने का मुख्य लाभ यह है कि आप पूर्व-एकत्रित डेटा को क्वेरी कर रहे हैं और एमडीएक्स को रिलेशनल तरीके के बजाय सांख्यिकीय तरीके से क्वेरी के लिए अनुकूलित किया गया है। फ्लैट परिणाम सेट का उत्पादन करने के लिए अब आप पंक्तियों और तालिकाओं को क्वेरी नहीं करते हैं लेकिन आप ट्यूपल्स और सेटों का उपयोग कर रहे हैं और एक बहुआयामी घन को समेटने के लिए।

इसे इस तरह से सोचें: यदि आप किसी विशेष आइटम समूह के लिए कुल बिक्री राशि प्राप्त करने के लिए SQL क्वेरी का उपयोग करते हैं, तो आपको एक क्वेरी लिखने की आवश्यकता होगी जो आइटम समूह में सभी आइटमों के लिए सभी इनवॉइस लाइनों को साइन करती है। यदि आप किसी घन का उपयोग कर रहे हैं और आइटम समूह स्तर पर एकत्रीकरण है, तो परिणाम की गणना प्रसंस्करण के दौरान की जाती है और प्रत्येक आइटम समूह के लिए एकत्रीकरण को संग्रहीत किया जाता है, जिससे प्रश्न तात्कालिक हो जाते हैं।

बहु-आयामी और एमडीएक्स रिलेशनल सेट-आधारित एसक्यूएल से पूरी तरह से अलग अवधारणा है।

आपका उदाहरण बहुत सरल हो सकता है क्योंकि आप परिवर्तन कर रहे होंगे जैसे कि आपके डेटा लोड प्रक्रिया के दौरान दिनांक पार्स करना और आपकी पिछले महीने की तुलना ए calculated measure। आपका seoul औसत और आज हो सकता हैcalculated members

यदि आपके क्यूब्स आपकी आवश्यकताओं के लिए अच्छी तरह से डिज़ाइन किए गए हैं, तो मेरा मानना ​​है कि आप प्रश्नों को लिखने की आवश्यकता के बिना भी अपने उदाहरण के डेटा को स्लाइस कर सकते हैं और डिसाइड कर सकते हैं, लेकिन यह एक सस्ता या किसी अन्य विश्लेषण उपकरण में करें।

फिर फिर से "एमडीएक्स में एसक्यूएल को फिर से लिखना" नहीं है। इसे सही और अलग मानसिकता के लिए उचित ज्ञान की आवश्यकता है। परिणाम सेट के बजाय वेन-डायग्राम्स सोचें।

साहसिक कार्य डेटाबेस का उपयोग करके आपको एक उदाहरण प्रदान करने के लिए, श्रेणी बाइक में ग्राहक द्वारा बिक्री आदेशों की संख्या को सूचीबद्ध करने की आवश्यकता की कल्पना करें।

यदि आपने एसक्यूएल का उपयोग किया है, तो आपको एक क्वेरी लिखने की आवश्यकता होगी जो बिक्री के आदेशों की संख्या को एक उत्पाद के साथ एक पंक्ति के रूप में गिना जाता है जो श्रेणी बाइक का होता है और ग्राहकों की तालिका में शामिल होता है, ताकि एक काफी जटिल क्वेरी बन जाए। ।

-- need distinct count, we're counting orders, not order lines
SELECT count(DISTINCT soh.salesorderid)
    ,pers.FirstName + ' ' + pers.LastName
FROM sales.SalesOrderDetail sod
-- we need product details to get to the category
INNER JOIN Production.Product p ON sod.ProductID = p.ProductID
-- but we need to pass via subcategories
INNER JOIN Production.ProductSubcategory psc ON p.ProductSubcategoryID = psc.ProductSubcategoryID
-- we finally get to the category
INNER JOIN Production.ProductCategory pc ON psc.ProductCategoryID = pc.ProductCategoryID
-- we also need the headers because that's where the customer is stored
INNER JOIN sales.SalesOrderHeader soh ON sod.SalesOrderID = soh.SalesOrderID
-- finally the customer, but we don't have his name here
INNER JOIN sales.Customer c ON soh.CustomerID = c.CustomerID
-- customers
INNER JOIN Person.Person pers ON c.PersonID = pers.BusinessEntityID
-- filter on bikes
WHERE pc.Name = 'bikes'
-- but the customers table doesn't contain the concatenated name
GROUP BY pers.FirstName + ' ' + pers.LastName;

MDX में (बशर्ते आपका घन अच्छी तरह से इस आवश्यकता के लिए डिज़ाइन किया गया हो) आप सिर्फ इसलिए लिख सकते हैं क्योंकि तर्क और जटिलता कहीं और स्थानांतरित हो गई है:

SELECT [Measures].[Internet Order Count] ON COLUMNS,
[Customer].[Customer].Members ON ROWS
FROM [Adventure Works]
WHERE [Product].[Product Categories].[Category].[Bikes]

3
यहां तक ​​कि एक माउस और एक बायस्कूल की तुलना की जा सकती है, हालांकि। माउस छोटा और जीवित है। Bycicle में धातु अधिक है और लागत अधिक है। दोनों गति में तुलनीय हैं।
जोन

6

OLAP क्यूब्स / डेटाबेस में निम्नलिखित विशेषताएं हैं:

  • उपयोगकर्ता की आवश्यकताओं के अनुसार पहले से ही एकत्रित जानकारी प्राप्त करें।
  • आसान और तेज पहुंच
  • विभिन्न आयामों में कुल डेटा में हेरफेर करने की क्षमता
  • क्यूब शास्त्रीय एकत्रीकरण फ़ंक्शंस का उपयोग करता है न्यूनतम, अधिकतम, गणना, योग, एवीजी, लेकिन विशिष्ट एकत्रीकरण फ़ंक्शंस का उपयोग भी कर सकता है।

MDX बनाम SQL:

एमडीएक्स को बहुआयामी डेटाबेस को नेविगेट करने और उनकी सभी वस्तुओं (आयामों, पदानुक्रम, स्तर, सदस्य और सेल) पर प्रश्नों को परिभाषित करने के लिए (केवल) पिवट टेबल का प्रतिनिधित्व प्राप्त करने के लिए बनाया गया है।

MDX एसक्यूएल कीवर्ड के रूप में समान का उपयोग करता है, की तरह SELECT, FROM, WHERE। अंतर यह है कि एसक्यूएल संबंधपरक विचार पैदा करता है जबकि एमडीएक्स डेटा के बहुआयामी विचार पैदा करता है ।

अंतर दो भाषाओं की सामान्य संरचना में भी देखा जाता है:

SQL क्वेरी: SELECT column1, column2, ..., column FROM table
MDX क्वेरी:SELECT axis1 ON COLUMNS, axis2 ON ROWS FROM cube

FROMडेटा स्रोत को निर्दिष्ट करता है:
SQL में:
MDX में एक या एक से अधिक टेबल : एक क्यूब

SELECT क्वेरी द्वारा पुनर्प्राप्त करने के लिए वांछित परिणामों को इंगित करता है:

SQL में:

  • दो आयामों (पंक्तियों और स्तंभों) में एक दृश्य डेटा
  • पंक्तियों में स्तंभों द्वारा परिभाषित एक ही संरचना होती है

MDX में:

  • क्वेरी परिणामों को बनाने के लिए आयामों की संख्या।
  • घन अक्षों के साथ भ्रम से बचने के लिए प्रयुक्त शब्द अक्ष।
  • पंक्तियों और स्तंभों के लिए कोई विशेष अर्थ नहीं है, लेकिन आपको प्रत्येक अक्ष को परिभाषित करना होगा: axe1 क्षैतिज अक्ष को परिभाषित करता है और अक्ष 2 ऊर्ध्वाधर अक्ष को परिभाषित करता है।

MDX क्वेरी उदाहरण: यहाँ छवि विवरण दर्ज करें

उपाय : यूनिट मूल्य, मात्रा, छूट, SalesAmount, माल ढुलाई
आयाम : समय
पदानुक्रम : वर्ष> तिमाही> महीना> सदस्यों के साथ:

  • वर्ष: 2010, 2011, 2012, 2013, 2014

  • क्वार्टर: Q1, Q2, Q3, Q4

  • माह: जनवरी, फरवरी, मार्च,…

आयाम : ग्राहक
पदानुक्रम : महाद्वीप> देश> राज्य> सदस्यों के साथ शहर:

  • शहर: पेरिस, ल्योन, बर्लिन, कोलन, मार्सिले, नैनटेस ...

  • राज्य: लॉयर एटलांटिक, बाउचेस डु रोन, बास राइन, टोरिनो ...

  • देश: ऑस्ट्रिया, बेल्जियम, डेनमार्क, फ्रांस, ...

  • महाद्वीप स्तर: यूरोप, उत्तरी अमेरिका, सूद अमेरिका, एशिया

आकार : उत्पाद
पदानुक्रम : श्रेणी> उपश्रेणी> सदस्यों के साथ उत्पाद:

  • श्रेणी: खाद्य, पेय ...
  • खाद्य श्रेणी: बेक्ड_फूड ...
  • ...

1

अद्यतन : यह उदाहरण बेहतर है:

क्वेरी लक्ष्य: 2010 की Q1 के दौरान कैलिफोर्निया में बेचे गए सभी उत्पाद परिवारों की बिक्री राशि और इकाइयों की संख्या (स्तंभों पर) प्राप्त करें

MDX

SELECT  {[Measures].[Unit Sales], [Measures].[Store Sales]} ON COLUMNS,
      {[Products].children} ON ROWS
FROM  [Sales]
WHERE ([Time].[2010].[Q1], [Customers].[USA].[CA])

एसक्यूएल

SELECT SUM(unit_sales) unit_sales_sum, SUM(store_sales) store_sales_sum
FROM sales
  LEFT JOIN products ON sales.product_id = products.id
  LEFT JOIN product_classes ON products.product_class_id = product_classes.id
  LEFT JOIN time ON sales.time_id = time.id
  LEFT JOIN customers ON sales.customer_id = customers.id
WHERE time.the_year = 2010 AND time.quarter = 'Q1'
  AND customers.country = 'USA' AND customers.state_province = 'CA'
GROUP BY product_classes.product_family
ORDER BY product_classes.product_family

स्रोत: मोड्रियन के लिए उपयोग नोट (जो रिलेशनल डेटाबेस पर उपयोग के लिए MDX प्रश्नों का अनुवाद करता है)


मुझे एक अच्छा उदाहरण मिला, हालाँकि SQL इतना अधिक जटिल नहीं है (MDX के बजाय सासबेस की तुलना में):

यहाँ छवि विवरण दर्ज करें

स्रोत: बिग डेटा (+ उपयोग मामलों) के लिए वास्तविक समय "OLAP" - bigdata.ro 2013

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.