Contoh MDX vs SQL yang bagus untuk pertanyaan analitis


11

Adakah yang bisa menunjukkan kepada saya contoh yang baik tentang keunggulan MDX dibandingkan SQL biasa ketika melakukan kueri analitik? Saya ingin membandingkan kueri MDX dengan kueri SQL yang memberikan hasil serupa.

Wikipedia mengatakan :

Meskipun dimungkinkan untuk menerjemahkan beberapa dari ini ke dalam SQL tradisional, seringkali akan memerlukan sintesis ekspresi SQL yang canggung bahkan untuk ekspresi MDX yang sangat sederhana.

Tetapi tidak ada kutipan atau contoh. Saya sepenuhnya sadar bahwa data yang mendasarinya harus diatur secara berbeda, dan OLAP akan membutuhkan lebih banyak pemrosesan dan penyimpanan per sisipan. (Proposal saya adalah pindah dari Oracle RDBMS ke Apache Kylin + Hadoop )

Konteks: Saya mencoba meyakinkan perusahaan saya bahwa kita harus menanyakan database OLAP daripada database OLTP. Sebagian besar permintaan SIEM banyak menggunakan pengelompokan berdasarkan kelompok, jenis, dan agregasi. Selain peningkatan kinerja, saya pikir permintaan OLAP (MDX) akan lebih ringkas dan lebih mudah untuk membaca / menulis daripada OLTP SQL yang setara. Contoh konkret akan mengarahkan poin, tapi saya bukan ahli SQL, apalagi MDX ...


Jika ini membantu, berikut adalah contoh kueri SQL terkait SIEM untuk peristiwa firewall yang terjadi dalam seminggu terakhir:

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

Jawaban:


10

MDXdan SQLsama sekali tidak sama, dan sering bahkan tidak sebanding, karena mereka bertanya multidimensionaldan relational databasesmasing - masing. Anda tidak dapat meminta database relasional yang ada dengan MDX.

Keuntungan utama menggunakan model multidimensi dan menggunakan MDX untuk meng-query-nya adalah bahwa Anda meng-query data pra-agregat dan MDX dioptimalkan untuk melakukan kueri dalam cara statistik daripada cara relasional. Anda tidak lagi query baris dan tabel untuk menghasilkan set hasil datar tetapi Anda menggunakan tupel dan set untuk mengiris dan mengagregasi kubus multidimensi.

Pikirkan seperti ini: jika Anda menggunakan kueri SQL untuk mendapatkan jumlah total penjualan untuk grup item tertentu, Anda perlu menulis kueri yang meringkas semua baris faktur untuk semua item dalam grup item. Jika Anda menggunakan kubus dan memiliki agregasi pada tingkat grup item, hasilnya dihitung selama pemrosesan dan agregasi disimpan untuk setiap grup item, membuat kueri seketika.

Multidimensional dan MDX adalah konsep yang sama sekali berbeda dari SQL berbasis relasional set.

Contoh Anda mungkin menjadi jauh lebih sederhana karena Anda akan melakukan transformasi seperti penguraian tanggal selama proses pemuatan data Anda dan perbandingan bulan lalu Anda bisa a calculated measure. Rata-rata seoul Anda dan hari ini bisa jadicalculated members

Jika kubus Anda dirancang dengan baik untuk kebutuhan Anda, saya yakin Anda bisa mengiris dan mencelupkan kumpulan data contoh Anda bahkan tanpa perlu menulis kueri tetapi melakukannya dalam pivottable atau alat analisis lain.

Kemudian lagi tidak ada "hanya menulis ulang SQL dalam MDX". Dibutuhkan sedikit pengetahuan untuk melakukannya dengan benar dan pola pikir yang berbeda. Pikirkan diagram-venn alih-alih set hasil.

Untuk memberikan Anda sebuah contoh menggunakan database adventureworks, bayangkan persyaratan untuk mencantumkan jumlah pesanan penjualan oleh pelanggan dalam kategori sepeda.

Jika Anda melakukannya dengan menggunakan SQL, Anda harus menulis kueri yang menghitung jumlah pesanan penjualan yang mengandung garis dengan produk yang kebetulan termasuk kategori sepeda dan menggabungkannya ke tabel pelanggan, sehingga akan menjadi permintaan yang cukup kompleks .

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

Di MDX (asalkan kubus Anda dirancang dengan baik untuk persyaratan ini) Anda bisa menulis karena logika dan kompleksitasnya telah pindah ke tempat lain:

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

3
Bahkan mouse dan bycicle bisa dibandingkan. Mouse lebih kecil dan hidup. Bycicle memiliki lebih banyak logam dan biaya lebih banyak. Keduanya sebanding dalam kecepatan.
Zon

6

OLAP Cubes / database memiliki karakteristik sebagai berikut:

  • Dapatkan informasi yang telah dikumpulkan sesuai dengan kebutuhan pengguna.
  • Akses mudah dan cepat
  • Kemampuan untuk memanipulasi data agregat dalam dimensi yang berbeda
  • Kubus menggunakan fungsi agregasi klasik min, maks, jumlah, jumlah, rata-rata, tetapi juga dapat menggunakan fungsi agregasi tertentu.

MDX versus SQL:

MDX dibuat untuk menavigasi basis data multidimensi dan untuk menentukan kueri pada semua objeknya (dimensi, hierarki, level, anggota, dan sel) untuk mendapatkan (cukup) representasi tabel pivot.

MDX menggunakan banyak identik sebagai kata kunci SQL, seperti SELECT, FROM, WHERE. Perbedaannya adalah bahwa SQL menghasilkan pandangan relasional sedangkan MDX menghasilkan pandangan data multidimensi .

Perbedaannya juga terlihat dalam struktur umum kedua bahasa:

SQL query: SELECT column1, column2, ..., column FROM table
MDX query:SELECT axis1 ON COLUMNS, axis2 ON ROWS FROM cube

FROMmenentukan sumber data:
Di SQL: satu atau lebih tabel
Di MDX: a cube

SELECT menunjukkan hasil yang diinginkan untuk dipulihkan oleh kueri:

Dalam SQL:

  • Tampilan data dalam dua dimensi (baris dan kolom)
  • Baris memiliki struktur yang sama yang ditentukan oleh kolom

Dalam MDX:

  • Sejumlah dimensi untuk membentuk hasil kueri.
  • Sumbu istilah yang digunakan untuk menghindari kebingungan dengan dimensi kubus.
  • Tidak ada arti khusus pada baris dan kolom, tetapi Anda harus mendefinisikan setiap sumbu: sumbu1 mendefinisikan sumbu horizontal dan sumbu 2 mendefinisikan sumbu vertikal.

Contoh permintaan MDX: masukkan deskripsi gambar di sini

Ukuran : Harga Satuan, Jumlah, Diskon, PenjualanJumlah,
Dimensi Pengiriman :
Hirarki waktu : Tahun> Kuartal> Bulan> dengan anggota:

  • Tahun: 2010, 2011, 2012, 2013, 2014

  • Kuartal: Q1, Q2, Q3, Q4

  • Bulan: Januari, Februari, Maret, ...

Dimensi :
Hirarki pelanggan : Benua> Negara> Negara Bagian> Kota dengan anggota:

  • Kota: Paris, Lyon, Berlin, Köln, Marseille, Nantes…

  • Negara: Loire atlantique, Bouches du Rhône, Bas Rhin, Torino…

  • Negara: Austria, Belgia, Danmark, Prancis, ...

  • Tingkat benua: Eropa, Amerika Utara, Amerika Selatan, Asia

Dimensi :
Hirarki produk : Kategori> Subkategori> produk dengan anggota:

  • Kategori: Makanan, Minuman ...
  • Kategori makanan: Baked_food ...
  • ...

1

pembaruan : Contoh ini lebih baik:

Sasaran kueri: Dapatkan jumlah penjualan dan jumlah unit (pada kolom) semua keluarga produk (pada baris) yang dijual di California selama Q1 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

sumber: Catatan penggunaan untuk Modrian (yang menerjemahkan pertanyaan MDX untuk digunakan pada basis data relasional)


Saya menemukan contoh yang layak, meskipun SQL tidak jauh lebih kompleks (dibandingkan dengan SaasBase, bukan MDX):

masukkan deskripsi gambar di sini

sumber: "OLAP" waktu-nyata untuk Data Besar (+ kasus penggunaan) - bigdata.ro 2013

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.