Usuário com melhor resposta
Demora na execução da VIEW

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?
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
Todas as Respostas
-
-
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
----
-
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 ONselect * 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
- Editado Wesley Neves quarta-feira, 28 de dezembro de 2016 10:58 correção
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 5 de janeiro de 2017 22:03
-
-
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
-