none
Criação da query MDX pelo BROWSER RRS feed

  • Pergunta

  • Boa tarde pessoal,

    minha aplicação possui um criador de querys MDX. Estou com um grande problema de performance à alguns dias e não consigo uma solução de jeito nenhum.
    O que acontece, é que tenho duas dimensões realmente grandes (item + de 60mil e emitente + de 100 mil). Quando o usuário solicita uma visão utilizando estas duas dimensões, o banco demora mais de 1 hora pra responder!
    Detalhe, isso só ocorre se essas dimensões possuirem filtro de exceção!
    Meu código fica +- assim
    With bla bla bla
    aggregate
    except
    bla bla bla

    Eu reuno todos as dimensões e vou montando como está ai em cima, depois dou os selects e ok! funciona! se não tenho filtro de exceção, fica rapido! se tem, fica impossível...

    Dai abri o browser do analysis e fui montar a mesma consulta visualmente! pelo profiler, reparei que ele fez uns create sessions e tudo mais

    Me parece que os valores pré-calculados (tudo sem exceção) está ok, mas quando preciso de um valor diferente do total de todos as linhas, o bixo pega! isso pq ele tem que recalcular o valor total, sem aquele item que eu pus de exceção

    vi também um tal de addcalculatedmember mas nem sei o que faz.


    alguem pode me dar uma idéia?

    att
    Leandro
    quarta-feira, 10 de dezembro de 2008 19:22

Respostas

  • De uma procurada pro OWC no google...

    Ele é justamente este componente que você chama... é bem provável que a instrução MDX gerada pelo OWC será melhor que o seu componente...

    OWC é um Componente da Microsoft, Office Web Components, você pode embutir ele na sua aplicação, e por fim o usuário irá utilizar a interface do OWC para gerar os relatórios...
    quinta-feira, 11 de dezembro de 2008 13:56

Todas as Respostas

  • Ja pensou em definir a propriedade AggregationUsage de seu Atributo como FULL?

    Tente verificar por qual campo é feito os filtros e marque ele como FULL...

    Caso tenha alguma dúvida é va la em Cube Structure\Dimensions\Attributes\ Seleciona o seu campo e altere a propriedade
    AggregationUsage


    quinta-feira, 11 de dezembro de 2008 10:30
  • Fabiano, obrigado pela ajuda.

    Nunca pensei em utilizar, pq nem sei o que seria hehehe tem como explicar algo?

    Não localizei ainda aonde altero a propriedade, mas estou procurando!

    Obrigado mais uma vez pela ajuda, quando achar eu testo!

    quinta-feira, 11 de dezembro de 2008 10:46
  • Fabiano,

    fiz a alteração que você falou mas não surtiu efeito algum!
    :/
    obrigado pela ajuda


    Preciso de um jeito inteligente de montagem de query mdx genérico! O que temos está inviável já

    quinta-feira, 11 de dezembro de 2008 11:17
  • Leandro, após fazer a alteração certifique-se de que existe uma agregação para esta dimensão, e será necessário reprocessar o cubo...

    Outra coisa, já pensou em utilizar o OWC para suas consultas?
    quinta-feira, 11 de dezembro de 2008 11:19
  • Desculpe Fabiano, mas meu conhecimento em OLAP é quase Null hehe
    :/

    o quer seria OWC?

    Só pra passar um overview melhor, o usuário da aplicação vai selecionando as dimensões que ele quer e os filtros que ele deseja e tudo mais.Depois, chamamos um componente nosso que pega todas as informações do usuário e transforma em query MDX. Esses montadores de query dinamicos.

    Quando o usuário dispara a consulta dele, o MDX fica dessa maneira:

    Code Snippet

    WITH   );


      MEMBER [BIN_SCH_Site_COD].[__DF] AS
        Aggregate({[BIN_SCH_Site_COD].&[101],[BIN_SCH_Site_COD].&[102]})
      MEMBER [BIN_SCH_CFOP_COD].[__DF] AS
        Aggregate
        (
          {
            Except
            (
              [BIN_SCH_CFOP_COD].&[1102].Parent.Children
             ,{
                [BIN_SCH_CFOP_COD].&[1102]
               ,[BIN_SCH_CFOP_COD].&[1152]
               ,[BIN_SCH_CFOP_COD].&[1202]
               ,[BIN_SCH_CFOP_COD].&[1409]
               ,[BIN_SCH_CFOP_COD].&[1411]
               ,[BIN_SCH_CFOP_COD].&[1415]
               ,[BIN_SCH_CFOP_COD].&[1918]
               ,[BIN_SCH_CFOP_COD].&[1949]
               ,[BIN_SCH_CFOP_COD].&[2403]
              }
            )
          }
        )
      MEMBER [Measures].[C00] AS
        (
          [Measures].[BIN_SCH_QTT_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[1].&[2].&[5]
        )
      MEMBER [Measures].[C01] AS
        (
          [Measures].[BIN_SCH_INV_VAL_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[1].&[2].&[5]
        )
      MEMBER [Measures].[C10] AS
        (
          [Measures].[BIN_SCH_QTT_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[1].&[2].&Devil
        )
      MEMBER [Measures].[C11] AS
        (
          [Measures].[BIN_SCH_INV_VAL_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[1].&[2].&Devil
        )
      MEMBER [Measures].[C20] AS
        (
          [Measures].[BIN_SCH_QTT_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[2].&[3].&[7]
        )
      MEMBER [Measures].[C21] AS
        (
          [Measures].[BIN_SCH_INV_VAL_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[2].&[3].&[7]
        )
      MEMBER [Measures].[C30] AS
        (
          [Measures].[BIN_SCH_QTT_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[2].&[3].&Music
        )
      MEMBER [Measures].[C31] AS
        (
          [Measures].[BIN_SCH_INV_VAL_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[2].&[3].&Music
        )
      MEMBER [Measures].[C40] AS
        (
          [Measures].[BIN_SCH_QTT_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[2].&[3].&[9]
        )
      MEMBER [Measures].[C41] AS
        (
          [Measures].[BIN_SCH_INV_VAL_INV]
         ,[BIN_SCH_PRD_Day].&[2008].&[2].&[3].&[9]
        )
      MEMBER [Measures].[C50] AS
        [Measures].[BIN_SCH_QTT_INV]
      MEMBER [Measures].[C51] AS
        [Measures].[BIN_SCH_INV_VAL_INV]
      MEMBER [BIN_SCH_EMI_COD].[__MF54bb5456-d8ac-4274-94c6-8622845a97f8] AS
        Aggregate
        (
          {
            Except
            (
              [BIN_SCH_EMI_COD].&[10].Parent.Children
             ,{[BIN_SCH_EMI_COD].&[10]}
            )
          }
        )
      MEMBER [BIN_SCH_Item].[__MF54bb5456-d8ac-4274-94c6-8622845a97f8] AS
        Aggregate
        (
          {
            Except
            (
              [BIN_SCH_Item].&[99999509].Parent.Children
             ,{
                [BIN_SCH_Item].&[99999509]
               ,[BIN_SCH_Item].&[99999205]
               ,[BIN_SCH_Item].&[99999514]
               ,[BIN_SCH_Item].&[99999511]
               ,[BIN_SCH_Item].&[99999102]
               ,[BIN_SCH_Item].&[99992001]
               ,[BIN_SCH_Item].&[99999513]
               ,[BIN_SCH_Item].&[99999524]
               ,[BIN_SCH_Item].&[99999512]
               ,[BIN_SCH_Item].&[99999529]
               ,[BIN_SCH_Item].&[99992011]
               ,[BIN_SCH_Item].&[99999203]
               ,[BIN_SCH_Item].&[99999103]
              }
            )
          }
        )
      MEMBER [BIN_SCH_EMI_COD].[__MFff718e65-acc3-4837-b8b8-e0fb063926d0] AS
        Aggregate
        (
          {
            Except
            (
              [BIN_SCH_EMI_COD].&[10].Parent.Children
             ,{[BIN_SCH_EMI_COD].&[10]}
            )
          }
        )
      MEMBER [BIN_SCH_Item].[__MFff718e65-acc3-4837-b8b8-e0fb063926d0] AS
        Aggregate
        (
          {
            Except
            (
              [BIN_SCH_Item].&[99999509].Parent.Children
             ,{
                [BIN_SCH_Item].&[99999509]
               ,[BIN_SCH_Item].&[99999205]
               ,[BIN_SCH_Item].&[99999514]
               ,[BIN_SCH_Item].&[99999511]
               ,[BIN_SCH_Item].&[99999102]
               ,[BIN_SCH_Item].&[99992001]
               ,[BIN_SCH_Item].&[99999513]
               ,[BIN_SCH_Item].&[99999524]
               ,[BIN_SCH_Item].&[99999512]
               ,[BIN_SCH_Item].&[99999529]
               ,[BIN_SCH_Item].&[99992011]
               ,[BIN_SCH_Item].&[99999203]
               ,[BIN_SCH_Item].&[99999103]
              }
            )
          }
        )
      SET [RowMembers] AS
        {
          (
            [MOU_BIN_SCH_TYPE_INVOICE].&[ND]
           ,[BIN_SCH_EMI_COD].[__MF54bb5456-d8ac-4274-94c6-8622845a97f8]
           ,[BIN_SCH_Item].[__MF54bb5456-d8ac-4274-94c6-8622845a97f8]
           ,[BIN_SCH_OPE_NAT_COD].&[5102PZ]
          )
         ,(
            [MOU_BIN_SCH_TYPE_INVOICE].&[OV]
           ,[BIN_SCH_EMI_COD].[__MFff718e65-acc3-4837-b8b8-e0fb063926d0]
           ,[BIN_SCH_Item].[__MFff718e65-acc3-4837-b8b8-e0fb063926d0]
           ,[BIN_SCH_OPE_NAT_COD].&[5102PZ]
          )
        }
    SELECT
      {
        [Measures].[C00]
       ,[Measures].[C01]
       ,[Measures].[C10]
       ,[Measures].[C11]
       ,[Measures].[C20]
       ,[Measures].[C21]
       ,[Measures].[C30]
       ,[Measures].[C31]
       ,[Measures].[C40]
       ,[Measures].[C41]
       ,[Measures].[C50]
       ,[Measures].[C51]
      } ON COLUMNS
     ,{[RowMembers]} ON ROWS
    FROM [MOU_BIN_SCH_Invoice_Info]
    WHERE
      (
        [BIN_SCH_CFOP_COD].[__DF]
       ,[BIN_SCH_Site_COD].[__DF]



    Essa consulta demora tempos exorbitantes! a dimensão ITEM e EMITENTE (EMI) são as maiores (30 mil, 50 mil, 60 mil por ai)

    se eu só retirar o item, por exemplo comentando no bloco:
     
    Code Snippet

    SET [RowMembers] AS

        {
          (
            [MOU_BIN_SCH_TYPE_INVOICE].&[ND]
           ,[BIN_SCH_EMI_COD].[__MF54bb5456-d8ac-4274-94c6-8622845a97f8]
           //,[BIN_SCH_Item].[__MF54bb5456-d8ac-4274-94c6-8622845a97f8]
           ,[BIN_SCH_OPE_NAT_COD].&[5102PZ]
          )
         ,(
            [MOU_BIN_SCH_TYPE_INVOICE].&[OV]
           ,[BIN_SCH_EMI_COD].[__MFff718e65-acc3-4837-b8b8-e0fb063926d0]
           //,[BIN_SCH_Item].[__MFff718e65-acc3-4837-b8b8-e0fb063926d0]
           ,[BIN_SCH_OPE_NAT_COD].&[5102PZ]
          )

    a consulta fica praticamente instântanea!

    Já vi uns addcalculatedmembers e tudo mais. você tem algum outro jeito de montar a consulta que seja mais performatico??


    quinta-feira, 11 de dezembro de 2008 11:50
  • De uma procurada pro OWC no google...

    Ele é justamente este componente que você chama... é bem provável que a instrução MDX gerada pelo OWC será melhor que o seu componente...

    OWC é um Componente da Microsoft, Office Web Components, você pode embutir ele na sua aplicação, e por fim o usuário irá utilizar a interface do OWC para gerar os relatórios...
    quinta-feira, 11 de dezembro de 2008 13:56

  • Fabiano Neves Amorim disse:

    De uma procurada pro OWC no google...

    Ele é justamente este componente que você chama... é bem provável que a instrução MDX gerada pelo OWC será melhor que o seu componente...

    OWC é um Componente da Microsoft, Office Web Components, você pode embutir ele na sua aplicação, e por fim o usuário irá utilizar a interface do OWC para gerar os relatórios...

    Algumas vezes as instruções MDX são geradas gradualmente conforme o usuário vai navegando na tabela dinâmica (OWC Pivot Table). Isto, para mim, está causando um buraco no desempenho de minha aplicação. Eu precisaria justamente do inverso, gerar um MDX na mão e rodá-lo no OWC. Conhece alguma forma de fazer isso?

    Testei o MDX e ele tem um tempo de resposta bem menor do que a mesma visão utilizando o OWC.




    Atenciosamente,
    Joaquim Coragem Manzini Junior
    terça-feira, 24 de março de 2009 14:08
  • Coragem,

    Pesquisei recentemente e concluí que o OWC não permite pegar o MDX que ele gera. Se da pra inserir o MDX nele, já é outra história.
    Dica: Eu fiz uma aplicação que gera o MDX mesmo depois de o usuário ter selecionado tudo o que ele quer no relatório, não tive muito estresse com ela, unica coisa é trocar os 'CROSSJOINS' por '*', que fica bem melhor.

    Na verdade, ela (minha aplicação) pode ser executada em qualquer momento, inclusive enquanto o usuário vai mexendo, só tem uma restrição do próprio MDX, que é que não pode haver somente uma mensuravel como linha, sem ter alguma hierarquia como coluna.

    Detalhe, que ter somente Hierarquia ou somente mensuravel como coluna ele aceita :D

    abraços
    segunda-feira, 31 de agosto de 2009 18:56
  • Coragem,

    Verifique se o post do nosso amigo Eduardo pode te ajudar a esclarecer melhor a sua dúvida.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 1 de setembro de 2009 00:37