none
Performance SQL RRS feed

  • Pergunta

  • Bom dia à Todos.

    Gostaria de Saber se alguém consegue melhorar a performance dessa minha query:

    WITH ProdutosHierarquicos(id, idPai) AS
     (
      SELECT [Seqüência da Matéria Prima] As id,
             [Seqüência do Produto] As idPai
      FROM [Matéria Prima]
      WHERE 1 = 1
      UNION ALL
      SELECT M.[Seqüência da Matéria Prima] As id,
             M.[Seqüência do Produto] As idPai
      FROM [Matéria Prima] M INNER JOIN ProdutosHierarquicos C ON M.[Seqüência da Matéria Prima] = C.idPai
     ), 
     SuperCusto(Produto, ValorCusto, MateriaPrima, QtdeUsada) AS
      (
       SELECT P.[Seqüência Do Produto],
              P.[Valor de Custo],
     M.[Seqüência da Matéria Prima], 
     M.[Quantidade de Matéria Prima]
       FROM Produtos AS P INNER JOIN [Matéria Prima] AS M ON P.[Seqüência Do Produto] = M.[Seqüência Do Produto]
       WHERE P.[Seqüência Do Produto] IN (SELECT idPai FROM ProdutosHierarquicos)
       UNION ALL
       SELECT S.Produto,
              CAST(0 As decimal(12, 4)),
     M.[Seqüência da Matéria Prima], 
     CAST(M.[Quantidade de Matéria Prima] * S.QtdeUsada As decimal(9, 3))
       FROM [Matéria Prima] AS M INNER JOIN SuperCusto AS S ON M.[Seqüência Do Produto] = S.MateriaPrima)   
    UPDATE Produtos SET [Valor de Custo] = Custo, [Valor Total] = Round(Custo * [Margem de Lucro], 2)
    FROM Produtos P JOIN
     (
      SELECT Produto,
             ROUND(Custo * (CASE WHEN Grupo LIKE 'Semi%' THEN 1 ELSE 1 + ([Parâmetros do Produto].[Percentual Acréscimo Produto] / 100) END), 4) Custo,
    [Valor de Custo], 
    Grupo
      FROM 
       (
        SELECT S.Produto Produto, 
          SUM(S.QtdeUsada * P.[Valor de Custo]) Custo, 
      MAX(S.ValorCusto) [Valor de Custo], 
      (GP.Descrição) Grupo
        FROM SuperCusto AS S LEFT JOIN [Matéria Prima] AS M ON S.MateriaPrima = M.[Seqüência Do Produto]
    INNER JOIN Produtos AS P ON S.MateriaPrima = P.[Seqüência Do Produto]
    INNER JOIN Produtos AS P2 ON S.Produto = P2.[Seqüência do Produto]
    LEFT JOIN [Grupo do Produto] GP ON P2.[Seqüência do Grupo Produto] = GP.[Seqüência do Grupo Produto]
    WHERE M.[Seqüência Do Produto] IS NULL
    GROUP BY S.Produto, GP.Descrição
       ) TabelaA CROSS JOIN [Parâmetros do Produto]) TabelaA ON P.[Seqüência do Produto] = TabelaA.Produto

    Abraços


    Armando Correa H Neto

    segunda-feira, 9 de setembro de 2013 12:41

Respostas

  • Armando,

    Mas qual é problema que você esta tendo?

    Você esta utilizando CTE e dentro da mesma, fazendo uso de Derived Table!!

    Será que você realmente precisa disso?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Alysson Queiroz sexta-feira, 20 de setembro de 2013 15:06
    sábado, 14 de setembro de 2013 16:30