Usuário com melhor resposta
Select Case - Otimização

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 ?
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.brSe 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
-
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 #tempA 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
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.brSe 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
-
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 #tempA 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