Usuário com melhor resposta
Procedure muito lenta

Pergunta
-
Boa tarde,
Estou com um problema com performance de procedure, tenho duas procedures que tem uma estrutura muito parecida, o nomes delas é sp_forecast_semovos e sp_forecast_ovos, decidi separar em duas pois estava tendo problemas de performance e achei que resolveria o problema mas não resolveu, vou postar uma delas e explico a diferença logo abaixo:
ALTER PROCEDURE [dbo].[SP_FORECAST_SEMOVOS] (@PERIODO INT, @ANOMES1 INT, @ANOMES2 INT, @ANOMES3 INT, @ANOMES4 INT, @ANOMES5 INT, @TIPO_CANAL VARCHAR(20), @MARCA VARCHAR(3)) WITH RECOMPILE AS BEGIN DECLARE @TIPO_CANAL_STR VARCHAR(30) DECLARE @MARCA_STR VARCHAR(30) DECLARE @SQL NVARCHAR(4000) DECLARE @GRUPO_PRODUTO VARCHAR(50) DECLARE @PARAMETROS NVARCHAR(4000) DECLARE @TIPO_CANAL1 VARCHAR(20) DECLARE @MARCA_TEMP VARCHAR(3) SET @TIPO_CANAL1 = @TIPO_CANAL SET @MARCA_TEMP = @MARCA IF @TIPO_CANAL1 <> 'TODOS' BEGIN SET @TIPO_CANAL_STR = ' AND R.Tipo_Canal = ' + CHAR(39) + @TIPO_CANAL1 + CHAR(39) + ' ' END ELSE BEGIN SET @TIPO_CANAL_STR = ' ' END IF @MARCA_TEMP <> '99' BEGIN SET @MARCA_STR = ' AND M.CODSAP_MARCA = ' + CHAR(39) + @MARCA_TEMP + CHAR(39) + ' ' END ELSE BEGIN SET @MARCA_STR = ' ' END SET @SQL = ' INSERT INTO FORECAST.Hist_Hierarq_Para_Representatividade SELECT T1.CANAL, T1.PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, CASE WHEN SUM(T1.VOL) < 0 THEN 0 ELSE SUM(T1.VOL) END AS VOLUME_KG, CASE WHEN SUM(T1.FNET) < 0 THEN 0 ELSE SUM(T1.FNET) END AS NETSALES FROM( SELECT T.CANAL, @PERIODO1 AS PERIODO, T.GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, CASE WHEN T.VOLUME < 0 THEN 0 ELSE T.VOLUME END AS VOL, CASE WHEN T.NET < 0 THEN 0 ELSE T.NET END AS FNET FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, GP.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) < 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME, CASE WHEN SUM(V.Valor_Liquido_Calculado) < 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) +') GROUP BY CCR.CODIGOCANALVENDA, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T ) AS T1 GROUP BY T1.CANAL, T1.PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE ' SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)' EXEC SP_EXECUTESQL @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA PRINT @SQL SET @SQL = ' INSERT INTO FORECAST.Hist_Cli_Para_Representatividade SELECT T2.CANAL, T2.PERIODO, T2.GRUPO_PRODUTO, T2.MARKET_SEGMENT, T2.CODSAP_MARCA, T2.CODSAP_PRODUCTSEGMENT, T2.CODSAP_PRODUCTLINE, T2.CODSAP_CLIENTE, T2.VOLUME_KG, CASE WHEN HI.VOLUME_KG = 0 THEN 0 ELSE T2.VOLUME_KG/HI.VOLUME_KG END AS REP, CASE WHEN HI.NETSALES= 0 THEN 0 ELSE T2.NETSALES/HI.NETSALES END AS REP_NETSALES, T2.NETSALES FROM( SELECT T1.CANAL, @PERIODO1 AS PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, T1.CODSAP_CLIENTE, CASE WHEN T1.VOLUME_KG = 0 THEN 0 ELSE T1.VOLUME_KG END AS VOLUME_KG, CASE WHEN T1.FNETSALES = 0 THEN 0 ELSE T1.FNETSALES END AS NETSALES FROM( SELECT T.CANAL, T.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE, SUM(T.VOLUME) AS VOLUME_KG, SUM(T.NET) AS FNETSALES FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) < 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME , CASE WHEN SUM(V.Valor_Liquido_Calculado) < 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) +') GROUP BY CCR.CODIGOCANALVENDA, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T GROUP BY T.CANAL, T.CODSAP_GRUPOPRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE ) AS T1 )T2 INNER JOIN FORECAST.Hist_Hierarq_Para_Representatividade HI ON HI.GRUPO_PRODUTO = T2.GRUPO_PRODUTO AND HI.MARKET_SEGMENT = T2.MARKET_SEGMENT AND HI.CODSAP_MARCA = T2.CODSAP_MARCA AND HI.CODSAP_PRODUCTSEGMENT = T2.CODSAP_PRODUCTSEGMENT AND HI.CODSAP_PRODUCTLINE = T2.CODSAP_PRODUCTLINE AND HI.PERIODO = T2.PERIODO AND HI.CANAL = T2.CANAL ' SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)' --PRINT @SQL EXEC SP_EXECUTESQL @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA SET @SQL = ' INSERT INTO FORECAST.HIST_FORECAST SELECT T1.CANAL, T1.PERIODO, T1.TIPO_CANAL, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, T1.CODSAP_CLIENTE, T1.CODSAP_ITEMPRODUTO, T1.VOLUME_KG, HI.REP AS REP_CLIENTE_NA_HIERARQUIA, CASE WHEN HI.VOLUME_KG = 0 THEN 0 ELSE T1.VOLUME_KG/HI.VOLUME_KG END AS REP_SKU_NO_CLIENTE, CASE WHEN HI.NETSALES = 0 THEN 0 ELSE T1.NETSALES/HI.NETSALES END AS REP_SKU_NO_CLIENTE_NETSALES FROM( SELECT T.CANAL, @PERIODO1 AS PERIODO, T.TIPO_CANAL, T.GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE, T.CODSAP_ITEMPRODUTO, T.VOLUME AS VOLUME_KG, T.NET AS NETSALES FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, R.TIPO_CANAL, GP.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) <= 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME, CASE WHEN SUM(V.Valor_Liquido_Calculado) <= 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) +') GROUP BY CCR.CODIGOCANALVENDA, R.TIPO_CANAL, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T )T1 INNER JOIN FORECAST.Hist_Cli_Para_Representatividade HI ON HI.GRUPO_PRODUTO = T1.GRUPO_PRODUTO AND HI.MARKET_SEGMENT = T1.MARKET_SEGMENT AND HI.CODSAP_MARCA = T1.CODSAP_MARCA AND HI.CODSAP_PRODUCTSEGMENT = T1.CODSAP_PRODUCTSEGMENT AND HI.CODSAP_PRODUCTLINE = T1.CODSAP_PRODUCTLINE AND HI.CODSAP_CLIENTE = T1.CODSAP_CLIENTE AND HI.PERIODO = T1.PERIODO AND HI.CANAL = T1.CANAL ' SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)' --PRINT @SQL EXEC SP_EXECUTESQL @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA END
A diferença da outra procedure é a clausula where que é da seguinte maneira:
WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO = ' + CHAR(39) + '02' + CHAR(39) + '
Já li sobre parametro sniffing e já executei varias tentativas pra arrumar essa procedure como usar with recompile, option(recompile) e variaveis locais, o problema ocorre quando eu executo a procedure sp_forecast_semovos e logo em seguida executo a procedure sp_forcast_ovos, a consulta demora uma eternidade pra terminar, passa de 16 minutos, as vezes ela roda em questao de segundos mas quando tento executar ela apos ter executado a outra ocorre essa demora.
alguem já passou por algum problema parecido?
Respostas
-
Bom dia , vc consegue os paramentos da procedure ??
siga esses passos na sua maquina, para avaliar uma possível criação de índice.
1) limpe o cache do seu sql
CHECKPOINT ; GO -- Limpa buffers (comandos add-hoc) DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS ; -- deleta o cache da query GO DBCC FREEPROCCACHE WITH NO_INFOMSGS; --deleta o plano execução ja feito GO DBCC FREESESSIONCACHE WITH NO_INFOMSGS GO
2) Execute sua procedure com os parâmetros dessa forma ,primeiro vc comenta o comando de criação, depois declara as variáveis ,que são passadas por parâmetro e coloque os valores nelas.
seque um exemplo;
OBS : quando for executar a sua sp inclua o plano de execução atual (CTRL +M)
e veja se aparece algum pedido de criação de índice.
ALTER PROCEDURE [dbo].[SP_FORECAST_SEMOVOS] -- ( -- @PERIODO INT , -- @ANOMES1 INT , -- @ANOMES2 INT , -- @ANOMES3 INT , -- @ANOMES4 INT , -- @ANOMES5 INT , -- @TIPO_CANAL VARCHAR(20) , -- @MARCA VARCHAR(3) -- ) -- WITH RECOMPILE --AS /*##########################*/ DECLARE @PERIODO INT, @ANOMES1 INT , @ANOMES2 INT , @ANOMES3 INT , @ANOMES4 INT , @ANOMES5 INT , @TIPO_CANAL VARCHAR(20) , @MARCA VARCHAR(3); SELECT @PERIODO =??, --Coloque os paramentros que são pasados para a procedure @ANOMES1 =??, @ANOMES2 =??, @ANOMES3 =??, @ANOMES4 =??, @ANOMES5 =??, @TIPO_CANAL , @MARCA; /*##########################*/ BEGIN DECLARE @TIPO_CANAL_STR VARCHAR(30); DECLARE @MARCA_STR VARCHAR(30); DECLARE @SQL NVARCHAR(4000); DECLARE @GRUPO_PRODUTO VARCHAR(50); DECLARE @PARAMETROS NVARCHAR(4000); DECLARE @TIPO_CANAL1 VARCHAR(20); DECLARE @MARCA_TEMP VARCHAR(3); SET @TIPO_CANAL1 = @TIPO_CANAL; SET @MARCA_TEMP = @MARCA; IF @TIPO_CANAL1 <> 'TODOS' BEGIN SET @TIPO_CANAL_STR = ' AND R.Tipo_Canal = ' + CHAR(39) + @TIPO_CANAL1 + CHAR(39) + ' '; END; ELSE BEGIN SET @TIPO_CANAL_STR = ' '; END; IF @MARCA_TEMP <> '99' BEGIN SET @MARCA_STR = ' AND M.CODSAP_MARCA = ' + CHAR(39) + @MARCA_TEMP + CHAR(39) + ' '; END; ELSE BEGIN SET @MARCA_STR = ' '; END; SET @SQL = ' INSERT INTO FORECAST.Hist_Hierarq_Para_Representatividade SELECT T1.CANAL, T1.PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, CASE WHEN SUM(T1.VOL) < 0 THEN 0 ELSE SUM(T1.VOL) END AS VOLUME_KG, CASE WHEN SUM(T1.FNET) < 0 THEN 0 ELSE SUM(T1.FNET) END AS NETSALES FROM( SELECT T.CANAL, @PERIODO1 AS PERIODO, T.GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, CASE WHEN T.VOLUME < 0 THEN 0 ELSE T.VOLUME END AS VOL, CASE WHEN T.NET < 0 THEN 0 ELSE T.NET END AS FNET FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, GP.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) < 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME, CASE WHEN SUM(V.Valor_Liquido_Calculado) < 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) + ') GROUP BY CCR.CODIGOCANALVENDA, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T ) AS T1 GROUP BY T1.CANAL, T1.PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE '; SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)'; EXEC sp_executesql @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA; PRINT @SQL; SET @SQL = ' INSERT INTO FORECAST.Hist_Cli_Para_Representatividade SELECT T2.CANAL, T2.PERIODO, T2.GRUPO_PRODUTO, T2.MARKET_SEGMENT, T2.CODSAP_MARCA, T2.CODSAP_PRODUCTSEGMENT, T2.CODSAP_PRODUCTLINE, T2.CODSAP_CLIENTE, T2.VOLUME_KG, CASE WHEN HI.VOLUME_KG = 0 THEN 0 ELSE T2.VOLUME_KG/HI.VOLUME_KG END AS REP, CASE WHEN HI.NETSALES= 0 THEN 0 ELSE T2.NETSALES/HI.NETSALES END AS REP_NETSALES, T2.NETSALES FROM( SELECT T1.CANAL, @PERIODO1 AS PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, T1.CODSAP_CLIENTE, CASE WHEN T1.VOLUME_KG = 0 THEN 0 ELSE T1.VOLUME_KG END AS VOLUME_KG, CASE WHEN T1.FNETSALES = 0 THEN 0 ELSE T1.FNETSALES END AS NETSALES FROM( SELECT T.CANAL, T.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE, SUM(T.VOLUME) AS VOLUME_KG, SUM(T.NET) AS FNETSALES FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) < 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME , CASE WHEN SUM(V.Valor_Liquido_Calculado) < 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) + ') GROUP BY CCR.CODIGOCANALVENDA, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T GROUP BY T.CANAL, T.CODSAP_GRUPOPRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE ) AS T1 )T2 INNER JOIN FORECAST.Hist_Hierarq_Para_Representatividade HI ON HI.GRUPO_PRODUTO = T2.GRUPO_PRODUTO AND HI.MARKET_SEGMENT = T2.MARKET_SEGMENT AND HI.CODSAP_MARCA = T2.CODSAP_MARCA AND HI.CODSAP_PRODUCTSEGMENT = T2.CODSAP_PRODUCTSEGMENT AND HI.CODSAP_PRODUCTLINE = T2.CODSAP_PRODUCTLINE AND HI.PERIODO = T2.PERIODO AND HI.CANAL = T2.CANAL '; SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)'; --PRINT @SQL EXEC sp_executesql @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA; SET @SQL = ' INSERT INTO FORECAST.HIST_FORECAST SELECT T1.CANAL, T1.PERIODO, T1.TIPO_CANAL, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, T1.CODSAP_CLIENTE, T1.CODSAP_ITEMPRODUTO, T1.VOLUME_KG, HI.REP AS REP_CLIENTE_NA_HIERARQUIA, CASE WHEN HI.VOLUME_KG = 0 THEN 0 ELSE T1.VOLUME_KG/HI.VOLUME_KG END AS REP_SKU_NO_CLIENTE, CASE WHEN HI.NETSALES = 0 THEN 0 ELSE T1.NETSALES/HI.NETSALES END AS REP_SKU_NO_CLIENTE_NETSALES FROM( SELECT T.CANAL, @PERIODO1 AS PERIODO, T.TIPO_CANAL, T.GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE, T.CODSAP_ITEMPRODUTO, T.VOLUME AS VOLUME_KG, T.NET AS NETSALES FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, R.TIPO_CANAL, GP.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) <= 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME, CASE WHEN SUM(V.Valor_Liquido_Calculado) <= 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) + ') GROUP BY CCR.CODIGOCANALVENDA, R.TIPO_CANAL, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T )T1 INNER JOIN FORECAST.Hist_Cli_Para_Representatividade HI ON HI.GRUPO_PRODUTO = T1.GRUPO_PRODUTO AND HI.MARKET_SEGMENT = T1.MARKET_SEGMENT AND HI.CODSAP_MARCA = T1.CODSAP_MARCA AND HI.CODSAP_PRODUCTSEGMENT = T1.CODSAP_PRODUCTSEGMENT AND HI.CODSAP_PRODUCTLINE = T1.CODSAP_PRODUCTLINE AND HI.CODSAP_CLIENTE = T1.CODSAP_CLIENTE AND HI.PERIODO = T1.PERIODO AND HI.CANAL = T1.CANAL '; SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)'; --PRINT @SQL EXEC sp_executesql @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA; --END;
Wesley Neves - Brasilia-DF
wesley.si.neves@gmail.com
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
- Editado Wesley Neves quinta-feira, 17 de agosto de 2017 11:37 correção
- Marcado como Resposta Filipe B CastroModerator quinta-feira, 17 de agosto de 2017 16:30
Todas as Respostas
-
Flavio,
pode ser muita coisa né?
Essa query retorna muitos registros para fazer insert?
Você pode começar seguindo o conteúdo do link abaixo e postar os resultados que ajudamos a avaliar.
http://rusanu.com/2014/02/24/how-to-analyse-sql-server-performance/
Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)
-
Flavio,
Pode ser sim parameter sniffing, devido a complexidade do seu código e volume de variáveis, neste caso, para resolver este comportamento onde o SQL Server entendendo que as variáveis devem ser tratadas como elementos fora do plano de execução a opção OPTIMIZE FOR no código fonte da procedure, como forma de orientar o SQL Server para reconhecer e otimizar o processamento da stored procedure e suas variáveis como elementos de um único plano de execução.
Veja se este exemplo ajuda:
-- Criando o Banco de Dados Create Database ParameterSniffing Go -- Criando a TabelaDados -- Create Table TabelaDados (Id Int Identity Primary Key, Descricao Char(100), Localal Char(6), DataCriacao DateTime Default Getdate(), Status char(2) default 'AC') Go -- Criando Índice na coluna Local para TabelaDados -- Create Index IND_Local on TabelaDados(Local) Go -- Inserindo massa de dados -- Insert Into TabelaDados (Name,Local) VALUES ('Test1','LocalA') GO 100000 Insert Into TabelaDados (Name,Local) VALUES ('Test1','LocalB') GO 10 -- Selecionando dados na TabelaDados com Local = 'LocalA' -- Select * From TabelaDados Where Local = 'LocalA' Go -- Selecionando dados na TabelaDados com Local = 'LocalA' -- Select * From TabelaDados Where Local = 'LocalB' Go -- Criando a Stored Procedure Create Procedure ObterDadosPorLocal (@Local Char(6)) As Begin Set NoCount ON Select * From TabelaDados Where Local = @Local End -- Executando a Stored Procedure ObterDadosPorLocal = LocalA -- ObterDadosPorLocal 'LocalA' Go -- Executando a Stored Procedure ObterDadosPorLocal = LocalB -- ObterDadosPorLocal 'LocalB' Go -- Obtendo informações sobre Plano de Execução de Stored Procedures -- Select OBJECT_NAME(s.object_id) SP_Name, eqp.query_plan From sys.dm_exec_procedure_stats s CROSS APPLY sys.dm_exec_query_plan (s.plan_handle) eqp Where DB_NAME(database_id) = 'ParameterSniffing' -- Recompilando a Stored Procedure -- SP_Recompile 'ObterDadosPorLocal' Go -- Alterando a Stored Procedure ObterDadosPorLocal adicionando a opção Recompile -- Alter Procedure ObterDadosPorLocal (@Local as Char(6)) With Recompile As Begin Set NoCount On Select * From TabelaDados Where Local = @Local End -- Executando novamente a Stored Procedure ObterDadosPorLocal, descartando o Cache do Plano de Execução -- Exec ObterDadosPorLocal @Local= N'LocalA' Exec ObterDadosPorLocal @Local= N'LocalB' Go -- Executando novamente a Stored Procedure ObterDadosPorLocal, recompilando e utilizando o do Plano de Execução, sem fazer o armazenamento -- Exec [dbo].[ObterDadosPorLocal] @Local = N'LocalA' WITH RECOMPILE Go -- Alterando a Stored Procedure ObterDadosPorLocal removendo a opção Recompile e adicionando a Query Hint Optimize -- Alter Procedure ObterDadosPorLocal (@Local CHAR(6)) As Begin Set NoCount On Select * From TabelaDados Where Local = @Local OPTION (OPTIMIZE FOR (@Local = 'LocalA')) End -- Executando a Stored Procedure ObterDadosPorLocal = LocalA -- ObterDadosPorLocal 'LocalA' Go -- Executando a Stored Procedure ObterDadosPorLocal = LocalB -- ObterDadosPorLocal 'LocalB' Go
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
Bom dia , vc consegue os paramentos da procedure ??
siga esses passos na sua maquina, para avaliar uma possível criação de índice.
1) limpe o cache do seu sql
CHECKPOINT ; GO -- Limpa buffers (comandos add-hoc) DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS ; -- deleta o cache da query GO DBCC FREEPROCCACHE WITH NO_INFOMSGS; --deleta o plano execução ja feito GO DBCC FREESESSIONCACHE WITH NO_INFOMSGS GO
2) Execute sua procedure com os parâmetros dessa forma ,primeiro vc comenta o comando de criação, depois declara as variáveis ,que são passadas por parâmetro e coloque os valores nelas.
seque um exemplo;
OBS : quando for executar a sua sp inclua o plano de execução atual (CTRL +M)
e veja se aparece algum pedido de criação de índice.
ALTER PROCEDURE [dbo].[SP_FORECAST_SEMOVOS] -- ( -- @PERIODO INT , -- @ANOMES1 INT , -- @ANOMES2 INT , -- @ANOMES3 INT , -- @ANOMES4 INT , -- @ANOMES5 INT , -- @TIPO_CANAL VARCHAR(20) , -- @MARCA VARCHAR(3) -- ) -- WITH RECOMPILE --AS /*##########################*/ DECLARE @PERIODO INT, @ANOMES1 INT , @ANOMES2 INT , @ANOMES3 INT , @ANOMES4 INT , @ANOMES5 INT , @TIPO_CANAL VARCHAR(20) , @MARCA VARCHAR(3); SELECT @PERIODO =??, --Coloque os paramentros que são pasados para a procedure @ANOMES1 =??, @ANOMES2 =??, @ANOMES3 =??, @ANOMES4 =??, @ANOMES5 =??, @TIPO_CANAL , @MARCA; /*##########################*/ BEGIN DECLARE @TIPO_CANAL_STR VARCHAR(30); DECLARE @MARCA_STR VARCHAR(30); DECLARE @SQL NVARCHAR(4000); DECLARE @GRUPO_PRODUTO VARCHAR(50); DECLARE @PARAMETROS NVARCHAR(4000); DECLARE @TIPO_CANAL1 VARCHAR(20); DECLARE @MARCA_TEMP VARCHAR(3); SET @TIPO_CANAL1 = @TIPO_CANAL; SET @MARCA_TEMP = @MARCA; IF @TIPO_CANAL1 <> 'TODOS' BEGIN SET @TIPO_CANAL_STR = ' AND R.Tipo_Canal = ' + CHAR(39) + @TIPO_CANAL1 + CHAR(39) + ' '; END; ELSE BEGIN SET @TIPO_CANAL_STR = ' '; END; IF @MARCA_TEMP <> '99' BEGIN SET @MARCA_STR = ' AND M.CODSAP_MARCA = ' + CHAR(39) + @MARCA_TEMP + CHAR(39) + ' '; END; ELSE BEGIN SET @MARCA_STR = ' '; END; SET @SQL = ' INSERT INTO FORECAST.Hist_Hierarq_Para_Representatividade SELECT T1.CANAL, T1.PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, CASE WHEN SUM(T1.VOL) < 0 THEN 0 ELSE SUM(T1.VOL) END AS VOLUME_KG, CASE WHEN SUM(T1.FNET) < 0 THEN 0 ELSE SUM(T1.FNET) END AS NETSALES FROM( SELECT T.CANAL, @PERIODO1 AS PERIODO, T.GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, CASE WHEN T.VOLUME < 0 THEN 0 ELSE T.VOLUME END AS VOL, CASE WHEN T.NET < 0 THEN 0 ELSE T.NET END AS FNET FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, GP.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) < 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME, CASE WHEN SUM(V.Valor_Liquido_Calculado) < 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) + ') GROUP BY CCR.CODIGOCANALVENDA, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T ) AS T1 GROUP BY T1.CANAL, T1.PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE '; SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)'; EXEC sp_executesql @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA; PRINT @SQL; SET @SQL = ' INSERT INTO FORECAST.Hist_Cli_Para_Representatividade SELECT T2.CANAL, T2.PERIODO, T2.GRUPO_PRODUTO, T2.MARKET_SEGMENT, T2.CODSAP_MARCA, T2.CODSAP_PRODUCTSEGMENT, T2.CODSAP_PRODUCTLINE, T2.CODSAP_CLIENTE, T2.VOLUME_KG, CASE WHEN HI.VOLUME_KG = 0 THEN 0 ELSE T2.VOLUME_KG/HI.VOLUME_KG END AS REP, CASE WHEN HI.NETSALES= 0 THEN 0 ELSE T2.NETSALES/HI.NETSALES END AS REP_NETSALES, T2.NETSALES FROM( SELECT T1.CANAL, @PERIODO1 AS PERIODO, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, T1.CODSAP_CLIENTE, CASE WHEN T1.VOLUME_KG = 0 THEN 0 ELSE T1.VOLUME_KG END AS VOLUME_KG, CASE WHEN T1.FNETSALES = 0 THEN 0 ELSE T1.FNETSALES END AS NETSALES FROM( SELECT T.CANAL, T.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE, SUM(T.VOLUME) AS VOLUME_KG, SUM(T.NET) AS FNETSALES FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) < 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME , CASE WHEN SUM(V.Valor_Liquido_Calculado) < 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) + ') GROUP BY CCR.CODIGOCANALVENDA, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T GROUP BY T.CANAL, T.CODSAP_GRUPOPRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE ) AS T1 )T2 INNER JOIN FORECAST.Hist_Hierarq_Para_Representatividade HI ON HI.GRUPO_PRODUTO = T2.GRUPO_PRODUTO AND HI.MARKET_SEGMENT = T2.MARKET_SEGMENT AND HI.CODSAP_MARCA = T2.CODSAP_MARCA AND HI.CODSAP_PRODUCTSEGMENT = T2.CODSAP_PRODUCTSEGMENT AND HI.CODSAP_PRODUCTLINE = T2.CODSAP_PRODUCTLINE AND HI.PERIODO = T2.PERIODO AND HI.CANAL = T2.CANAL '; SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)'; --PRINT @SQL EXEC sp_executesql @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA; SET @SQL = ' INSERT INTO FORECAST.HIST_FORECAST SELECT T1.CANAL, T1.PERIODO, T1.TIPO_CANAL, T1.GRUPO_PRODUTO, T1.MARKET_SEGMENT, T1.CODSAP_MARCA, T1.CODSAP_PRODUCTSEGMENT, T1.CODSAP_PRODUCTLINE, T1.CODSAP_CLIENTE, T1.CODSAP_ITEMPRODUTO, T1.VOLUME_KG, HI.REP AS REP_CLIENTE_NA_HIERARQUIA, CASE WHEN HI.VOLUME_KG = 0 THEN 0 ELSE T1.VOLUME_KG/HI.VOLUME_KG END AS REP_SKU_NO_CLIENTE, CASE WHEN HI.NETSALES = 0 THEN 0 ELSE T1.NETSALES/HI.NETSALES END AS REP_SKU_NO_CLIENTE_NETSALES FROM( SELECT T.CANAL, @PERIODO1 AS PERIODO, T.TIPO_CANAL, T.GRUPO_PRODUTO, T.MARKET_SEGMENT, T.CODSAP_MARCA, T.CODSAP_PRODUCTSEGMENT, T.CODSAP_PRODUCTLINE, T.CODSAP_CLIENTE, T.CODSAP_ITEMPRODUTO, T.VOLUME AS VOLUME_KG, T.NET AS NETSALES FROM( SELECT CCR.CODIGOCANALVENDA AS CANAL, R.TIPO_CANAL, GP.CODSAP_GRUPOPRODUTO AS GRUPO_PRODUTO, MS.CODSAP_MARKETSEGMENT AS MARKET_SEGMENT, CASE @MARCA1 WHEN 99 THEN 0 ELSE M.CODSAP_MARCA END AS CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO, CASE WHEN SUM(V.VOLUME_FINAL) <= 0 THEN 0 ELSE SUM(V.VOLUME_FINAL) END AS VOLUME, CASE WHEN SUM(V.Valor_Liquido_Calculado) <= 0 THEN 0 ELSE SUM(V.Valor_Liquido_Calculado) END AS NET FROM VOLUME_ITEM V INNER JOIN ITEM_PRODUTO I ON I.CODSAP_ITEMPRODUTO = V.CODSAP_ITEMPRODUTO INNER JOIN GRUPO_PRODUTO GP ON GP.CODSAP_GRUPOPRODUTO = I.CODSAP_GRUPOPRODUTO INNER JOIN HIERARQUIA_PRODUTO H ON H.CODSAP_HIERARQUIA = I.CODSAP_HIERARQUIA INNER JOIN PRODUCT_LINE PL ON PL.CodSAP_ProductLine = H.CodSAP_ProductLine INNER JOIN PRODUCT_SEGMENT PS ON PS.CodSAP_ProductSegment = H.CodSAP_ProductSegment INNER JOIN PRODUTO_FAMILIA PF ON PF.CodSAP_ProdutoFamilia = H.CodSAP_ProdutoFamilia INNER JOIN MARCA M ON M.CodSAP_Marca = H.CodSAP_Marca INNER JOIN MARKET_SEGMENT MS ON MS.CODSAP_MARKETSEGMENT = H.CODSAP_MARKETSEGMENT INNER JOIN CCR ON CCR.CODIGOCANALVENDA = V.CODIGOCANALVENDA AND CCR.CODSAP_CLIENTE = V.CODSAP_CLIENTE INNER JOIN SUPERVISOR SU ON SU.CODSAP_SUPERVISOR = CCR.CODSAP_REPRESENTANTE INNER JOIN REGIAO R ON R.CODSAP_REGIAO = SU.CODSAP_REGIAO INNER JOIN CALENDARIO CA ON CA.DATA = V.DATA_EMISSAO WHERE CA.ANOMES in(@ANOMES11,@ANOMES21,@ANOMES31,@ANOMES41,@ANOMES51) ' + @TIPO_CANAL_STR + @MARCA_STR + 'AND V.ID_Cat_Item NOT IN(37,3,15,4,10,16,7,29) AND GP.CODSAP_GRUPOPRODUTO IN (' + CHAR(39) + '01' + CHAR(39) + ',' + CHAR(39) + '05' + CHAR(39) + ') GROUP BY CCR.CODIGOCANALVENDA, R.TIPO_CANAL, GP.CODSAP_GRUPOPRODUTO, MS.CODSAP_MARKETSEGMENT, M.CODSAP_MARCA, PS.CODSAP_PRODUCTSEGMENT, PL.CODSAP_PRODUCTLINE, V.CODSAP_CLIENTE, V.CODSAP_ITEMPRODUTO ) AS T )T1 INNER JOIN FORECAST.Hist_Cli_Para_Representatividade HI ON HI.GRUPO_PRODUTO = T1.GRUPO_PRODUTO AND HI.MARKET_SEGMENT = T1.MARKET_SEGMENT AND HI.CODSAP_MARCA = T1.CODSAP_MARCA AND HI.CODSAP_PRODUCTSEGMENT = T1.CODSAP_PRODUCTSEGMENT AND HI.CODSAP_PRODUCTLINE = T1.CODSAP_PRODUCTLINE AND HI.CODSAP_CLIENTE = T1.CODSAP_CLIENTE AND HI.PERIODO = T1.PERIODO AND HI.CANAL = T1.CANAL '; SET @PARAMETROS = '@PERIODO1 INT, @ANOMES11 INT, @ANOMES21 INT, @ANOMES31 INT, @ANOMES41 INT, @ANOMES51 INT, @MARCA1 VARCHAR(3)'; --PRINT @SQL EXEC sp_executesql @SQL, @PARAMETROS, @PERIODO1 = @PERIODO, @ANOMES11 = @ANOMES1, @ANOMES21 = @ANOMES2, @ANOMES31 = @ANOMES3, @ANOMES41 = @ANOMES4, @ANOMES51 = @ANOMES5, @MARCA1 = @MARCA; --END;
Wesley Neves - Brasilia-DF
wesley.si.neves@gmail.com
MTA-SQL Server
MTA- Web Development
Analista Desenvolvedor.NET
Pós-Graduando em Banco de Dados
"Se a resposta for útil ou ajudar ,não esqueça de marcar"
- Editado Wesley Neves quinta-feira, 17 de agosto de 2017 11:37 correção
- Marcado como Resposta Filipe B CastroModerator quinta-feira, 17 de agosto de 2017 16:30
-
Boa tarde,
Por falta de retorno, essa thread está encerrada.
Se necessário, favor abrir uma nova thread.
Atenciosamente,Filipe B de Castro
Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.