none
Demora na execução da VIEW RRS feed

  • Pergunta

  • Boa tarde!

    Novamente precisando da ajuda de vocês...

    Estou desenvolvendo um relatório para a diretoria e baseia -se em encontrar o valor do rateio dos contratos de cada filial.

    Consegui montar uma estrutura com a CTE

    segue:

     with CTE_Sum as(
    
     SELECT DISTINCT 
            v.cod_filial,
    	v.desc_filial,
            P.COMPETENCIA,
    	P.IDFILTRO AS COD_L_NEGOC,
            FGC.nome as linha_neg,
            P.IDGCC, 
    	t.GRUPOCCUSTO,
            G.DescGrupoCentroCusto as contrato,  
           	v.SUM_CUSTO_FILIAL AS CUSTO_FILIAL,
    	SUM(P.RL) OVER(PARTITION BY  v.cod_filial,P.IDFILTRO) as SOMA_CONTRATOS_POR_LINHA_NEGOC,
    	SUM(P.RL) OVER(PARTITION BY v.cod_filial) as SOMA_TOTAL_LINHA_NEG_DA_FILIAL,
       FROM dw_plano_estrategico P
       INNER JOIN  grupocentrocusto g ON P.IDGCC = G.idGrupoCentroCusto
       INNER JOIN  FiltroGrupoCentroCusto FGC ON FGC.id = P.IDFILTRO
       LEFT  JOIN  vw_custo_filiais_sintetico_v v ON v.competencia  = P.COMPETENCIA  and v.cont_vinculados = P.IDGCC
       LEFT  JOIN  cad_filiais_contratos_det_t t  ON T.GRUPOCCUSTO = P.IDGCC
        WHERE 
            P.COMPETENCIA = '201601'
    )
    
    SELECT 
        *,
        (SOMA_CONTRATOS_POR_LINHA_NEGOC / SOMA_TOTAL_LINHA_NEG_DA_FILIAL)* CUSTO_FILIAL AS RATEIO
    FROM CTE_Sum

    Quando eu executo esse comando acima consigo obter resposta em menos de 1 segundo.

    Porém criei uma view com essa estrutura e se dou apenas um select * from vw_rateio_v where competencia = '201601'
    demora 2 min pra executar e trazer as informações, além de mostrar resultados completamente diferentes do que é mostrado quando eu executo o a estrutura completa.

    Não sei o que acontece. Alguém poderia me ajudar?

    Como poderia solucionar isso?

    terça-feira, 27 de dezembro de 2016 19:15

Respostas

  • Problema de demora da execução da view solucionado após incluir dois índices nas tabelas envolvidas.

    Obrigada pela atenção de vocês

    • Marcado como Resposta carine.couto terça-feira, 3 de janeiro de 2017 16:27
    terça-feira, 3 de janeiro de 2017 16:27

Todas as Respostas

  • Faz um favor posta o plano de  execução  do resultado do select

    1) sem a definição da view ,apenas o select puro 

    2) agora com a definição da view

    obs: o seu DISTINCT e realmente necessário ?


    Wesley Neves

    terça-feira, 27 de dezembro de 2016 19:26
  • ELA esta monta assim:

     

    ---alter view vw_rateio_v

    with CTE_Sum as( SELECT DISTINCT v.cod_filial, v.desc_filial, P.COMPETENCIA, P.IDFILTRO AS COD_L_NEGOC, FGC.nome as linha_neg, P.IDGCC, t.GRUPOCCUSTO, G.DescGrupoCentroCusto as contrato, v.SUM_CUSTO_FILIAL AS CUSTO_FILIAL, SUM(P.RL) OVER(PARTITION BY v.cod_filial,P.IDFILTRO) as SOMA_CONTRATOS_POR_LINHA_NEGOC, SUM(P.RL) OVER(PARTITION BY v.cod_filial) as SOMA_TOTAL_LINHA_NEG_DA_FILIAL, FROM dw_plano_estrategico P INNER JOIN grupocentrocusto g ON P.IDGCC = G.idGrupoCentroCusto INNER JOIN FiltroGrupoCentroCusto FGC ON FGC.id = P.IDFILTRO LEFT JOIN vw_custo_filiais_sintetico_v v ON v.competencia = P.COMPETENCIA and v.cont_vinculados = P.IDGCC LEFT JOIN cad_filiais_contratos_det_t t ON T.GRUPOCCUSTO = P.IDGCC WHERE ) SELECT *, (SOMA_CONTRATOS_POR_LINHA_NEGOC / SOMA_TOTAL_LINHA_NEG_DA_FILIAL)* CUSTO_FILIAL AS RATEIO FROM CTE_Sum

    ----

    terça-feira, 27 de dezembro de 2016 20:04
  • Bom dia Carine 

    de uma atenção no itens marcados

    WITH    CTE_Sum
              AS ( SELECT DISTINCT
                            
                            [COMPETENCIA] = P.COMPETENCIA  --from ,
                            [COD_L_NEGOC] = P.IDFILTRO  --from,
                            [linha_neg] = FGC.nome --inner ,
                            [IDGCC] = P.IDGCC --from ,
    			[contrato] = g.DescGrupoCentroCusto --inner,
    			[cod_filial] = v.cod_filial ,--por ser nullo? e se for o que deve vir ?
                            [desc_filial] = v.desc_filial  --por ser nullo? e se for o que deve vir ?,
                            [GRUPOCCUSTO] = t.GRUPOCCUSTO --por ser nullo? e se for o que deve vir ?,
                            [CUSTO_FILIAL] =   --por ser nullo? e se for o que deve vir ? ,
                            [SOMA_CONTRATOS_POR_LINHA_NEGOC] = SUM(P.RL) OVER ( PARTITION BY v.cod_filial, P.IDFILTRO ) ,--( PARTITION BY v.cod_filial)
                            [SOMA_TOTAL_LINHA_NEG_DA_FILIAL] = SUM(P.RL) OVER ( PARTITION BY v.cod_filial ), --(PARTITION BY v.cod_filial)
                   FROM     dw_plano_estrategico P
                            INNER JOIN grupocentrocusto g ON P.IDGCC = g.idGrupoCentroCusto
                            INNER JOIN FiltroGrupoCentroCusto FGC ON FGC.id = P.IDFILTRO
                            LEFT  JOIN vw_custo_filiais_sintetico_v v ON ( v.competencia = P.COMPETENCIA AND v.cont_vinculados = P.IDGCC )
                            LEFT  JOIN cad_filiais_contratos_det_t t ON t.GRUPOCCUSTO = P.IDGCC
                   WHERE    P.COMPETENCIA = '201601')
         SELECT * ,
                ( [CTE_Sum].[SOMA_CONTRATOS_POR_LINHA_NEGOC] / [CTE_Sum].[SOMA_TOTAL_LINHA_NEG_DA_FILIAL] ) * [CUSTO_FILIAL] AS RATEIO
         FROM   [CTE_Sum];
         

    a pergunta e o que acontece se 

    1)  quando v.cod_filial, v.desc_filial,t.GRUPOCCUSTO,v.SUM_CUSTO_FILIAL for nullo ??

    2)veja que vc usa 

    ( PARTITION BY v.cod_filial) onde com o left join v.cod_filial é nullo.

    3) por favor rode o select 

    SET STATISTICS IO ON 
    SET STATISTICS TIME ON 

    select * from vw_rateio_v where competencia = '201601'

    e posta a saida da aba Messagens do lado do Result.

    e altere sua view para 

    ALTER VIEW vw_rateio_v AS
    WITH    CTE_Sum
              AS ( SELECT DISTINCT
                            
                            [COMPETENCIA] = P.COMPETENCIA  --from ,
                            [COD_L_NEGOC] = P.IDFILTRO  --from,
                            [linha_neg] = FGC.nome --inner ,
                            [IDGCC] = P.IDGCC --from ,
    						[contrato] = g.DescGrupoCentroCusto --inner,
    						[cod_filial] = v.cod_filial ,--por ser nullo? e se for o que deve vir ?
                            [desc_filial] = v.desc_filial  --por ser nullo? e se for o que deve vir ?,
                            [GRUPOCCUSTO] = t.GRUPOCCUSTO --por ser nullo? e se for o que deve vir ?,
                            [CUSTO_FILIAL] = v.SUM_CUSTO_FILIAL --por ser nullo? e se for o que deve vir ? ,
                            [SOMA_CONTRATOS_POR_LINHA_NEGOC] = SUM(P.RL) OVER ( PARTITION BY v.cod_filial, P.IDFILTRO ) ,--( PARTITION BY v.cod_filial)
                            [SOMA_TOTAL_LINHA_NEG_DA_FILIAL] = SUM(P.RL) OVER ( PARTITION BY v.cod_filial ), --(PARTITION BY v.cod_filial)
                   FROM     dw_plano_estrategico P
                            INNER JOIN grupocentrocusto g ON P.IDGCC = g.idGrupoCentroCusto
                            INNER JOIN FiltroGrupoCentroCusto FGC ON FGC.id = P.IDFILTRO
                            INNER JOIN vw_custo_filiais_sintetico_v v ON ( v.competencia = P.COMPETENCIA AND v.cont_vinculados = P.IDGCC )
                            INNER  JOIN cad_filiais_contratos_det_t t ON t.GRUPOCCUSTO = P.IDGCC
                   WHERE    P.COMPETENCIA = '201601')
         SELECT * ,
                ( [CTE_Sum].[SOMA_CONTRATOS_POR_LINHA_NEGOC] / [CTE_Sum].[SOMA_TOTAL_LINHA_NEG_DA_FILIAL] ) * [CUSTO_FILIAL] AS RATEIO
         FROM   [CTE_Sum];

    e avalie a saída como o INNER JOINS


    Wesley Neves


    quarta-feira, 28 de dezembro de 2016 10:57
  • Se puder postar a estrutura das tabelas

    1)

    dw_plano_estrategico, ,grupocentrocusto ,FiltroGrupoCentroCusto ,vw_custo_filiais_sintetico_v ,cad_filiais_contratos_det_t 

    Os campos e os tipos de dados


    Wesley Neves

    sexta-feira, 30 de dezembro de 2016 12:00
  • Problema de demora da execução da view solucionado após incluir dois índices nas tabelas envolvidas.

    Obrigada pela atenção de vocês

    • Marcado como Resposta carine.couto terça-feira, 3 de janeiro de 2017 16:27
    terça-feira, 3 de janeiro de 2017 16:27
  • Parabéns Carine

    Wesley Neves

    terça-feira, 3 de janeiro de 2017 16:37