none
Select Case - Otimização RRS feed

  • Pergunta

  • Bom dia pessoal,

    Estou com dificuldade em fazer uma consulta é preciso de ajuda.

    Tenho uma tabela com Codigo do Produto,valor,tipo do produto.

    Preciso de 4 Colunas a primeira a soma de todos os produtos
    na segunda a soma dos produtos cuja o tipo seja de 1 a 3
    a terceira a soma dos produtos cuja o tipo seja de 4 a 6
    e a quarta a soma dos produtos cuja o tipo seja de 7 a 9


    Eu fiz uma consulta, porem demora muito tempo, mais de 10 minutos por conta da quantidade de linhas que tem na tabela e da subconsultas que tem no meu comando, mesmo filtrando por data.

    Esse foi o select que fiz


    select  
    SUM(Valor) as  " Valor Total",
    (select SUM(Valor) from TeProduto where tipo in (1,2,3)) as "Comida",
    (Select SUM(Valor) from TeProduto where tipo in (4,5,6)) as "Informatica",
    (Select SUM(Valor) from TeProduto where tipo in (7,8,9)) as "Outros"
    from TeProduto


    Pensei é até tentei em fazer com case, porem não consegui criar 3 tabelas para cada resultado somado.


    Alguem pode me auxiliar ?




    segunda-feira, 3 de setembro de 2012 13:19

Respostas

  • Faça uns testes com criação de índices sobre e3sta tabela para testar.

    Tente primeiro criar um índice NonClustered sobre a coluna "Tipo";
    Se não for o suficiente, tente criar um índice NonClustered sobre a coluna "Tipo" adicionando a coluna "Valor" nalista de Include.

    Lembro que é somente para testes, pois mesmo que resolva a questão da velocidade desta consulta você deverá verificar se este índice não irá impactar negativamente na performance como um todo.

    Índices não devem ser criados "olhando" apenas para uma determinada consulta.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Naves terça-feira, 4 de setembro de 2012 13:07
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    segunda-feira, 3 de setembro de 2012 13:39
    Moderador
  • Não sei quantas colunas tem essa tabela, mas talvez você poderia jogar numa temporária uma query:

    select 
    tipo, 
    sum(Valor) 
    into #temp
    from TeProduto
    group by tipo

    ou

    select 
    tipo, 
    Valor
    into #temp
    from TeProduto


    depois:


    select 
    SUM(Valor) as  'Valor Total',
    (select SUM(Valor) from #temp where tipo in (1,2,3)) as "Comida",
    (Select SUM(Valor) from #temp where tipo in (4,5,6)) as "Informatica",
    (Select SUM(Valor) from #temp where tipo in (7,8,9)) as "Outros"
    from #temp

    A diferença entre a minha query e a sua é que a sua rodaria 4 selects diferentes da tabela Teproduto e a minha rodaria 1 select da TeProduto e os outros 3 da #temp (que usa o Tempdb).

    Se isso não ajudar em nada ou não for conveniente, a dica do Roberson Ferreira _ é o que eu usaria como alternativa. 

    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    segunda-feira, 3 de setembro de 2012 18:22

Todas as Respostas

  • Faça uns testes com criação de índices sobre e3sta tabela para testar.

    Tente primeiro criar um índice NonClustered sobre a coluna "Tipo";
    Se não for o suficiente, tente criar um índice NonClustered sobre a coluna "Tipo" adicionando a coluna "Valor" nalista de Include.

    Lembro que é somente para testes, pois mesmo que resolva a questão da velocidade desta consulta você deverá verificar se este índice não irá impactar negativamente na performance como um todo.

    Índices não devem ser criados "olhando" apenas para uma determinada consulta.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Roberson Naves terça-feira, 4 de setembro de 2012 13:07
    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    segunda-feira, 3 de setembro de 2012 13:39
    Moderador
  • Não sei quantas colunas tem essa tabela, mas talvez você poderia jogar numa temporária uma query:

    select 
    tipo, 
    sum(Valor) 
    into #temp
    from TeProduto
    group by tipo

    ou

    select 
    tipo, 
    Valor
    into #temp
    from TeProduto


    depois:


    select 
    SUM(Valor) as  'Valor Total',
    (select SUM(Valor) from #temp where tipo in (1,2,3)) as "Comida",
    (Select SUM(Valor) from #temp where tipo in (4,5,6)) as "Informatica",
    (Select SUM(Valor) from #temp where tipo in (7,8,9)) as "Outros"
    from #temp

    A diferença entre a minha query e a sua é que a sua rodaria 4 selects diferentes da tabela Teproduto e a minha rodaria 1 select da TeProduto e os outros 3 da #temp (que usa o Tempdb).

    Se isso não ajudar em nada ou não for conveniente, a dica do Roberson Ferreira _ é o que eu usaria como alternativa. 

    • Marcado como Resposta Harley Araujo quarta-feira, 5 de setembro de 2012 21:01
    segunda-feira, 3 de setembro de 2012 18:22