Ir para conteúdo
Fórum Script Brasil
  • 0

Query muito lenta - Preciso de Ajuda


GilbertoMiranda

Pergunta

Olá pessoal.

Sou novo aqui no forum e no mundo do desenvolvimento.

Tenho um sistema na empresa onde trabalho que, devido às necessidades do usuário (que por sinal é o dono da empresa), está utilizando uma query (feita por mim) muito grande e que acabou ficando lenta demais. Ela demora cerca de 10 minutos para ser executada.

Vou postá-la abaixo e gostaria de que alguém me desse uma luz para torná-la mais eficiente. Saliento que ela está sendo usada por um objeco ADODC do VB.

sql = "select p.cod_produto, p.cod_produto * 10 + rx.dbo.calcdigitomod11(p.cod_produto) as CodProduto, p.descricao, p.preço, (e.estoque - e.retencao) as Estoque, " _
                            & "(select unidades from rx.dbo.hist_per_produto where ano = " & Ano & " and periodo = " & Mes - 3 & " and cod_produto = p.cod_produto) as Media3, " _
                            & "(select unidades from rx.dbo.hist_per_produto where ano = " & Ano & " and periodo = " & Mes - 2 & " and cod_produto = p.cod_produto) as Media2, " _
                            & "(select unidades from rx.dbo.hist_per_produto where ano = " & Ano & " and periodo = " & Mes - 1 & " and cod_produto = p.cod_produto) as Media1, " _
                            & "(select unidades from rx.dbo.hist_per_produto where ano = " & Ano & " and periodo = " & Mes & " and cod_produto = p.cod_produto) as Atual, " _
                            & "round((select media_90 from rx.dbo.produto_estatistica where cod_produto = p.cod_produto),2) as Media90, " _
                            & "round((Select top 1 valor_unitario from rx.dbo.titulo_item as ti inner join rx.dbo.titulo as t on ti.cod_titulo = t.cod_titulo where ti.cod_produto = p.cod_produto and t.operacao_pedido = 7 order by t.emissao desc),2) as Custo, " _
                            & "(Select top 1 quantidade from rx.dbo.titulo_item as ti inner join rx.dbo.titulo as t on ti.cod_titulo = t.cod_titulo where ti.cod_produto = p.cod_produto and t.operacao_pedido = 7 order by t.emissao desc) as Quantidade, " _
                            & "(select sum (pci.qtd_pedida - pci.recebido) from rx.dbo.ped_compra_item as pci inner join rx.dbo.ped_compra as pc on pci.cod_pedido = pc.cod_pedido where pci.cod_produto = p.cod_produto and pc.cod_situacao not in(50,60) and pc.digitando = 0 having sum (pci.qtd_pedida - pci.recebido) >= 0) as Pendente, " _
                            & "(select top 1 validade from rx.dbo.lote as l inner join rx.dbo.lote_estoque as le on l.id_lote = le.id_lote where id_lote_classificacao = 1 and estoque > 0 and l.cod_produto = p.cod_produto order by validade) as Validade, " _
                            & "(select preço from vccustom.dbo.promocao_mensal where codproduto = p.cod_produto and mes = " & Mes & " and ano = " & Ano & ") as Promo, " _
                            & "p.unidade, p.emb_compra, en.fantasia " _
                            & "from rx.dbo.produto as p inner join rx.dbo.produto_estoque as e on p.cod_produto = e.cod_produto " _
                            & "inner join rx.dbo.entidade as en on p.cod_entidade = en.cod_entidade " _
                        & "Where p.situacao = 0 " _
                        & "order by p.descricao "

Agradeço desde já a atenção.

Att,

Gilberto.

Editado por kuroi
Adicionar tag CODE
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Bom dia Gilberto,

A sua consulta está demorando por causa da quantidade de subselects que está fazendo.

Quando você roda esta consulta, o sql aguarda o resultado de todos os subselects para remontar o select principal. Isso faz com que o tempo fique realmente muuuuito alto.

Tente retirar os subselects, fazendo apenas um select. Se não der, tente fazer passo a passo a consulta, utilizando temporárias.

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia Gilberto,

A sua consulta está demorando por causa da quantidade de subselects que está fazendo.

Quando você roda esta consulta, o sql aguarda o resultado de todos os subselects para remontar o select principal. Isso faz com que o tempo fique realmente muuuuito alto.

Tente retirar os subselects, fazendo apenas um select. Se não der, tente fazer passo a passo a consulta, utilizando temporárias.

Fulvio, boa tarde. Agradeço muito a resposta.

Poderia me dar um pequeno exemplo de como seriam essas temporárias ?

Eu fiz varios subselects porque se utilizasse o inner join muitos registros não viriam na consulta.

Obrigado mais uma vez.

Att,

Gilberto Miranda

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Gilberto,

Seria apenas uma temporária, com as colunas que necessita. Segue exemplo com explicações.

CREATE TABLE #Temporaria (Cod_Produto INT, CodProduto INT, Descricao VARCHAR(xxx), preço MONEY, etc...., Media3 INT)

--Vai separando os subselects e fazendo passo a passo. Tente fazer o mínimo possível de selects.

-- Um exemplo:
INSERT INTO #Temporaria (Media3)
select unidades from rx.dbo.hist_per_produto where ano = 2010 and periodo = 4 and cod_produto = p.cod_produto

-- Atenção: o resultado do select acima tem que ser um valor, porque senão dará erro.

-- Pra ir conferindo os valores, poderá dar um select na temporária:
SELECT * FROM #Temporaria

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...