none
Group By ou Sub Select RRS feed

  • Pergunta

  • Boa tarde!!!

    Gostaria de saber se tem alguma diferença em performance em uma view usando SUM com Group By ou Sub Select.

    Tabela de Vendas e Itens. Poderia fazer:

    1) INNER JOIN entre as duas tabelas, fazer um SUM dos itens Group By do ID da venda.

    2) Nao fazer INNER JOIN nas tabelas, e fazer um Sub Select com SUM nos itens com WHERE pelo ID da Venda

    As duas opções daria o mesmo resultado nos dados retornados, mas teria alguma diferenca na performance com uma quantidade grande de dados?

    Obrigado!

    quinta-feira, 1 de março de 2012 15:02

Respostas

  • Olá DaviSaba,

    Você pode ver na prática a diferença. Habilite a visualização do plano de execução da query e  comprove você mesmo.

    abraços.


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    • Marcado como Resposta DaviSaba quinta-feira, 1 de março de 2012 17:05
    quinta-feira, 1 de março de 2012 15:37
  • Olá DaviSaba,

    A primeira opção é mais performática, pois se você fizer a segunda opção, caso algum pedido não tenha itens(não faz mto sentido mas...) serão retornados também, resultando em mais linhas para o sql server retornar.

    Os cenários que você mencionou são esses?

    --Opção 1
    SELECT I.COD_PED, SUM(I.QTD) FROM itens_pedido I
    INNER JOIN PEDIDO P ON P.COD = I.COD_PED
    GROUP BY I.COD_PED
    
    --Opção 2 
    SELECT P.COD , (SELECT SUM(I.QTD) QTD FROM ITENS_PEDIDO I
    				WHERE P.COD = I.COD_PED) AS Total
    FROM PEDIDO P



    David Silva | MCITP| MCTS | MCP | ITILF | Blog: http://tilive.wordpress.com


    • Editado David Silva quinta-feira, 1 de março de 2012 16:39
    • Marcado como Resposta DaviSaba quinta-feira, 1 de março de 2012 17:05
    quinta-feira, 1 de março de 2012 16:37

Todas as Respostas

  • Olá DaviSaba,

    Você pode ver na prática a diferença. Habilite a visualização do plano de execução da query e  comprove você mesmo.

    abraços.


    Dhiego Piroto - MCP | MCTS SQL Server 2008 Developer | Email: dhiegopiroto@gmail.com

    • Marcado como Resposta DaviSaba quinta-feira, 1 de março de 2012 17:05
    quinta-feira, 1 de março de 2012 15:37
  • Olá DaviSaba,

    A primeira opção é mais performática, pois se você fizer a segunda opção, caso algum pedido não tenha itens(não faz mto sentido mas...) serão retornados também, resultando em mais linhas para o sql server retornar.

    Os cenários que você mencionou são esses?

    --Opção 1
    SELECT I.COD_PED, SUM(I.QTD) FROM itens_pedido I
    INNER JOIN PEDIDO P ON P.COD = I.COD_PED
    GROUP BY I.COD_PED
    
    --Opção 2 
    SELECT P.COD , (SELECT SUM(I.QTD) QTD FROM ITENS_PEDIDO I
    				WHERE P.COD = I.COD_PED) AS Total
    FROM PEDIDO P



    David Silva | MCITP| MCTS | MCP | ITILF | Blog: http://tilive.wordpress.com


    • Editado David Silva quinta-feira, 1 de março de 2012 16:39
    • Marcado como Resposta DaviSaba quinta-feira, 1 de março de 2012 17:05
    quinta-feira, 1 de março de 2012 16:37
  • Eu fiz o teste sugerido pelo Dhiego e o plano de execucao fez exatamente o mesmo processo com os mesmos custos ao banco.

    Eu rodei os select's individualmente e demora 9 segundos com 500 mil registros.

    Eu acredito que o banco consegue entender que os dois selects sao exatamentes iguais e processa da mesma forma.

    Obrigado!!!

    quinta-feira, 1 de março de 2012 17:05
  • Complementando os testes, como estamos falando de venda, fiz 3 sub select:

    1) Qtde

    2) AVG do Unitario

    3) Total

    O resultado quando era somente 1 sub select era o mesmo tempo com INNER JOIN e Group By. Agora com 3 sub select o tempo esta 5 seg. maior com sub select.

    Abraço.

    quinta-feira, 1 de março de 2012 17:43