Ví dụ hay về MDX vs SQL cho các truy vấn phân tích


11

Ai đó có thể chỉ cho tôi một ví dụ hay về lợi thế của MDX so với SQL thông thường khi thực hiện các truy vấn phân tích không? Tôi muốn so sánh một truy vấn MDX với một truy vấn SQL cho kết quả tương tự.

Wikipedia nói :

Mặc dù có thể dịch một số trong số này sang SQL truyền thống, nhưng nó thường yêu cầu tổng hợp các biểu thức SQL vụng về ngay cả đối với các biểu thức MDX rất đơn giản.

Nhưng không có một trích dẫn cũng như ví dụ. Tôi hoàn toàn biết rằng dữ liệu cơ bản phải được tổ chức khác nhau và OLAP sẽ yêu cầu xử lý và lưu trữ nhiều hơn trên mỗi lần chèn. (Đề xuất của tôi là chuyển từ Oracle RDBMS sang Apache Kylin + Hadoop )

Bối cảnh: Tôi đang cố gắng thuyết phục công ty của mình rằng chúng ta nên truy vấn cơ sở dữ liệu OLAP thay vì cơ sở dữ liệu OLTP. Hầu hết các truy vấn SIEM sử dụng nhiều nhóm, sắp xếp và tổng hợp. Bên cạnh việc tăng hiệu năng, tôi nghĩ các truy vấn OLAP (MDX) sẽ ngắn gọn và dễ đọc / dễ đọc hơn so với SQL OLTP tương đương. Một ví dụ cụ thể sẽ lái xe về nhà, nhưng tôi không phải là chuyên gia về SQL, ít MDX hơn ...


Nếu nó hữu ích, đây là một truy vấn SQL liên quan đến SIEM mẫu cho các sự kiện tường lửa đã xảy ra trong tuần qua:

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

Câu trả lời:


10

MDXSQLkhông có cách nào giống nhau, và thường không thể so sánh được, vì chúng đang truy vấn multidimensionalrelational databasestương ứng. Bạn không thể truy vấn cơ sở dữ liệu quan hệ hiện có của mình bằng MDX.

Ưu điểm chính của việc sử dụng mô hình đa chiều và sử dụng MDX để truy vấn đó là bạn đang truy vấn dữ liệu tổng hợp trước và MDX được tối ưu hóa để truy vấn theo cách thống kê thay vì theo cách liên quan. Bạn không còn truy vấn các hàng và bảng để tạo ra một tập kết quả phẳng nhưng bạn đang sử dụng các bộ dữ liệu và các bộ để cắt và tổng hợp một khối đa chiều.

Hãy nghĩ về nó như thế này: nếu bạn sử dụng truy vấn SQL để lấy tổng số tiền bán hàng cho một nhóm mặt hàng cụ thể, bạn sẽ cần phải viết một truy vấn tổng hợp tất cả các dòng hóa đơn cho tất cả các mặt hàng trong nhóm mặt hàng. Nếu bạn đang sử dụng một khối và có các tập hợp ở cấp độ nhóm mục, kết quả được tính trong quá trình xử lý và các tập hợp được lưu trữ cho từng nhóm mục, thực hiện truy vấn ngay lập tức.

Đa chiều và MDX là một khái niệm hoàn toàn khác với SQL dựa trên tập hợp quan hệ.

Ví dụ của bạn có thể trở nên đơn giản hơn rất nhiều vì bạn sẽ thực hiện các biến đổi, chẳng hạn như phân tích ngày trong quá trình tải dữ liệu của bạn và so sánh tháng trước của bạn có thể là a calculated measure. Trung bình seoul của bạn và hôm nay có thể làcalculated members

Nếu các hình khối của bạn được thiết kế tốt cho các yêu cầu của bạn, tôi tin rằng bạn có thể cắt và cắt nhỏ tập dữ liệu của ví dụ mà không cần phải viết các truy vấn nhưng thực hiện nó trong một công cụ phân tích có thể tách rời hoặc khác.

Sau đó, một lần nữa không có "chỉ viết lại SQL trong MDX". Nó đòi hỏi một chút kiến ​​thức để làm điều đó đúng và một tư duy khác. Hãy suy nghĩ sơ đồ venn thay vì tập kết quả.

Để cung cấp cho bạn một ví dụ sử dụng cơ sở dữ liệu mạo hiểm, hãy tưởng tượng yêu cầu liệt kê số lượng đơn đặt hàng bán của khách hàng trong danh mục xe đạp.

Nếu bạn đã làm điều đó bằng cách sử dụng SQL, bạn sẽ cần phải viết một truy vấn đếm số lượng đơn đặt hàng bán có chứa một dòng với một sản phẩm thuộc loại xe đạp và tham gia vào bảng khách hàng, do đó sẽ trở thành một truy vấn khá phức tạp .

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

Trong MDX (với điều kiện khối lập phương của bạn được thiết kế tốt cho yêu cầu này) bạn chỉ có thể viết vì logic và độ phức tạp đã chuyển đi nơi khác:

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

3
Tuy nhiên, ngay cả một con chuột và một cái bạt cũng có thể được so sánh. Chuột nhỏ hơn và còn sống. Bycicle có nhiều kim loại và chi phí nhiều hơn. Cả hai đều tương đương về tốc độ.
Zon

6

OLAP Cubes / cơ sở dữ liệu có các đặc điểm sau:

  • Có được thông tin đã tổng hợp theo nhu cầu của người dùng.
  • Truy cập dễ dàng và nhanh chóng
  • Khả năng thao tác dữ liệu tổng hợp theo các kích thước khác nhau
  • Một khối sử dụng các hàm tổng hợp cổ điển min, max, Count, sum, avg, nhưng cũng có thể sử dụng các hàm tổng hợp cụ thể.

MDX so với SQL:

MDX được tạo để điều hướng các cơ sở dữ liệu đa chiều và để xác định các truy vấn trên tất cả các đối tượng của chúng (kích thước, phân cấp, cấp độ, thành viên và ô) để có được (đơn giản) một cách biểu diễn các bảng trụ.

MDX sử dụng nhiều giống hệt như từ khóa SQL, như SELECT, FROM, WHERE. Sự khác biệt là SQL tạo ra các khung nhìn quan hệ trong khi MDX tạo ra các khung nhìn đa chiều của dữ liệu .

Sự khác biệt cũng được thấy trong cấu trúc chung của hai ngôn ngữ:

Truy vấn SQL: SELECT column1, column2, ..., column FROM table
Truy vấn MDX:SELECT axis1 ON COLUMNS, axis2 ON ROWS FROM cube

FROMchỉ định nguồn dữ liệu:
Trong SQL: một hoặc nhiều bảng
Trong MDX: một khối

SELECT cho biết kết quả mong muốn để phục hồi bằng truy vấn:

Trong SQL:

  • Một dữ liệu xem theo hai chiều (hàng và cột)
  • Các hàng có cùng cấu trúc được xác định bởi các cột

Trong MDX:

  • Bất kỳ số lượng kích thước để tạo thành kết quả truy vấn.
  • Trục hạn được sử dụng để tránh nhầm lẫn với kích thước khối.
  • Không có ý nghĩa đặc biệt đối với các hàng và cột, nhưng bạn phải xác định từng trục: axe1 xác định trục ngang và trục 2 xác định trục dọc.

Ví dụ truy vấn MDX: nhập mô tả hình ảnh ở đây

Các biện pháp : Đơn giá, Số lượng, Giảm giá, Doanh số,
Kích thước vận chuyển :
Phân cấp thời gian : Năm> Quý> Tháng> với các thành viên:

  • Năm: 2010, 2011, 2012, 2013, 2014

  • Quý: Q1, Q2, Q3, Q4

  • Tháng: Tháng 1, Tháng 2, Tháng 3, Ngày

Kích thước :
Phân cấp khách hàng : Lục địa> Quốc gia> Bang> Thành phố với các thành viên:

  • Thành phố: Paris, Lyon, Berlin, Köln, Marseille, Nantes

  • Bang: sông atlantique, Bouches du Rhône, Bas Rhin, Torino

  • Quốc gia: Áo, Bỉ, Danmark, Pháp, ...

  • Cấp lục địa: Châu Âu, Bắc Mỹ, Sud America, Châu Á

Kích thước :
Phân cấp sản phẩm : Danh mục> Danh mục con> sản phẩm có thành viên:

  • Thể loại: Đồ ăn, Đồ uống
  • Danh mục thực phẩm: Nướng
  • Giáo dục

1

cập nhật : Ví dụ này tốt hơn:

Mục tiêu truy vấn: Nhận số lượng bán và số lượng đơn vị (trên cột) của tất cả các họ sản phẩm (trên hàng) được bán ở California trong quý 1 năm 2010

MDX

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

SQL

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

nguồn: Ghi chú sử dụng cho Modrian (dịch các truy vấn MDX để sử dụng trên cơ sở dữ liệu quan hệ)


Tôi đã tìm thấy một ví dụ điển hình, mặc dù SQL không phức tạp hơn nhiều (so với SaasBase thay vì MDX):

nhập mô tả hình ảnh ở đây

nguồn: Thời gian thực OLAP trực tuyến cho dữ liệu lớn (+ trường hợp sử dụng) - bigdata.ro 2013

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.