AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 138311
Accepted
Leftium
Leftium
Asked: 2016-05-13 00:35:47 +0800 CST2016-05-13 00:35:47 +0800 CST 2016-05-13 00:35:47 +0800 CST

Bom exemplo de MDX vs SQL para consultas analíticas

  • 772

Alguém pode me mostrar um bom exemplo das vantagens do MDX sobre o SQL regular ao fazer consultas analíticas? Gostaria de comparar uma consulta MDX com uma consulta SQL que fornece resultados semelhantes.

Wikipédia diz :

Embora seja possível traduzir alguns deles em SQL tradicional, isso frequentemente exigiria a síntese de expressões SQL desajeitadas, mesmo para expressões MDX muito simples.

Mas não há citação nem exemplo. Estou plenamente ciente de que os dados subjacentes devem ser organizados de maneira diferente e o OLAP exigirá mais processamento e armazenamento por inserção. (Minha proposta é passar de um Oracle RDBMS para Apache Kylin + Hadoop )

Contexto: Estou tentando convencer minha empresa de que devemos consultar um banco de dados OLAP em vez de um banco de dados OLTP. A maioria das consultas SIEM faz uso intenso de agrupamento, classificação e agregação. Além do aumento de desempenho, acho que as consultas OLAP (MDX) seriam mais concisas e fáceis de ler/gravar do que o SQL OLTP equivalente. Um exemplo concreto deixaria claro, mas não sou especialista em SQL, muito menos em MDX...


Se ajudar, aqui está um exemplo de consulta SQL relacionada ao SIEM para eventos de firewall que aconteceram na semana passada:

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
olap mdx
  • 3 3 respostas
  • 16824 Views

3 respostas

  • Voted
  1. Best Answer
    Tom V
    2016-05-13T01:06:46+08:002016-05-13T01:06:46+08:00

    MDXe SQLnão são de forma alguma os mesmos, e muitas vezes nem mesmo comparáveis, pois estão consultando multidimensionale relational databasesrespectivamente. Você não pode consultar seu banco de dados relacional existente com MDX.

    A principal vantagem de usar um modelo multidimensional e usar MDX para consultá-lo é que você está consultando dados pré-agregados e que o MDX é otimizado para consultar de maneira estatística em vez de relacional. Você não consulta mais linhas e tabelas para produzir um conjunto de resultados simples, mas está usando tuplas e conjuntos para segmentar e agregar um cubo multidimensional.

    Pense assim: se você usar uma consulta SQL para obter o valor total das vendas de um determinado grupo de itens, precisará escrever uma consulta que resuma todas as linhas da fatura de todos os itens do grupo de itens. Se você estiver usando um cubo e tiver agregações no nível do grupo de itens, o resultado será calculado durante o processamento e as agregações serão armazenadas para cada grupo de itens, tornando as consultas instantâneas.

    Multidimensional e MDX é um conceito totalmente diferente do SQL baseado em conjunto relacional.

    Seu exemplo pode se tornar muito mais simples porque você faria as transformações, como a análise de data durante o processo de carregamento de dados e sua comparação do último mês poderia ser um arquivo calculated measure. Sua média de Seul e hoje pode sercalculated members

    Se seus cubos forem bem projetados para seus requisitos, acredito que você poderia fatiar e dividir o conjunto de dados de seu exemplo sem precisar escrever consultas, mas faça isso em uma tabela dinâmica ou outra ferramenta de análise.

    Então, novamente, não há "apenas reescrever SQL em MDX". Requer um pouco de conhecimento para fazer isso direito e uma mentalidade diferente. Pense em diagramas de Venn em vez de conjuntos de resultados.

    Para fornecer um exemplo usando o banco de dados adventureworks, imagine a necessidade de listar o número de pedidos de vendas por cliente na categoria bicicletas.

    Se você fizesse isso usando SQL, precisaria escrever uma consulta que contasse o número de pedidos de vendas contendo uma linha com um produto que por acaso é da categoria bicicletas e associá-la à tabela de clientes, de modo que se tornaria uma consulta bastante complexa .

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

    No MDX (desde que seu cubo seja bem projetado para esse requisito), você pode apenas escrever porque a lógica e a complexidade foram movidas para outro lugar:

    SELECT [Measures].[Internet Order Count] ON COLUMNS,
    [Customer].[Customer].Members ON ROWS
    FROM [Adventure Works]
    WHERE [Product].[Product Categories].[Category].[Bikes]
    
    • 11
  2. Yassine LD
    2016-05-13T01:31:54+08:002016-05-13T01:31:54+08:00

    Os cubos/bancos de dados OLAP possuem as seguintes características:

    • Obtenha informações já agregadas de acordo com as necessidades do usuário.
    • Acesso fácil e rápido
    • Capacidade de manipular os dados agregados em diferentes dimensões
    • Um cubo usa funções de agregação clássicas min, max, count, sum, avg, mas também pode usar funções de agregação específicas.

    MDX versus SQL:

    O MDX é feito para navegar em bancos de dados multidimensionais e definir consultas sobre todos os seus objetos (dimensões, hierarquias, níveis, membros e células) para obter (simplesmente) uma representação de tabelas dinâmicas.

    O MDX usa muitas palavras-chave SQL idênticas, como SELECT, FROM, WHERE. A diferença é que o SQL produz exibições relacionais enquanto o MDX produz exibições multidimensionais de dados .

    A diferença também é vista na estrutura geral das duas línguas:

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

    FROMespecifica a fonte de dados:
    Em SQL: uma ou mais tabelas
    Em MDX: um cubo

    SELECTindica os resultados desejados para recuperar pela consulta:

    Em SQL:

    • Uma visualização de dados em duas dimensões (linhas e colunas)
    • As linhas têm a mesma estrutura definida pelas colunas

    Em MDX:

    • Qualquer número de dimensões para formar os resultados da consulta.
    • O termo eixo usado para evitar confusão com as dimensões do cubo.
    • Nenhum significado especial para as linhas e colunas, mas você deve definir cada eixo: axe1 define o eixo horizontal e o eixo 2 define o eixo vertical.

    Exemplo de consulta MDX: insira a descrição da imagem aqui

    Medidas : Preço unitário, Quantidade, Desconto, Valor de vendas, Frete
    Dimensão :
    Hierarquia de tempo : Ano > Trimestre > Mês > com membros:

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

    • Trimestre: Q1, Q2, Q3, Q4

    • Mês: janeiro, fevereiro, março,…

    Dimensão :
    Hierarquia do cliente : Continente > País > Estado > Cidade com membros :

    • Cidade: Paris, Lyon, Berlim, Köln, Marselha, Nantes…

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

    • País: Áustria, Bélgica, Dinamarca, França, ...

    • Nível do continente: Europa, América do Norte, América do Sul, Ásia

    Dimensão :
    Hierarquia do produto : Categoria > Subcategoria > produto com membros :

    • Categoria: Alimentos, Bebidas…
    • Categoria de comida: Baked_food …
    • …
    • 7
  3. Leftium
    2016-05-18T20:49:25+08:002016-05-18T20:49:25+08:00

    atualização : Este exemplo é melhor:

    Objetivo da consulta: obter o valor das vendas e o número de unidades (em colunas) de todas as famílias de produtos (em linhas) vendidas na Califórnia durante o primeiro trimestre de 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
    

    fonte: Notas de uso para Modrian (que traduz consultas MDX para uso em bancos de dados relacionais)


    Encontrei um exemplo decente, embora o SQL não seja muito mais complexo (comparado ao SaasBase em vez do MDX):

    insira a descrição da imagem aqui

    fonte: “OLAP” em tempo real para Big Data (+ casos de uso) - bigdata.ro 2013

    • 1

relate perguntas

  • Obter contagem distinta de membros calculados?

  • Qual é o objetivo das junções SQL se você tiver OLAP?

  • Transferindo dados de bancos de dados OLTP para OLAP

  • Manipulando atributos que variam com o tempo em um Datamart

  • procurando uma alternativa mais leve ao cognos express [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve