Por que tanto tempo para abrir uma query?

Delphi

24/03/2004

A instrução SQL abaixo funciona blz. Só que demora demais para carregar, e são poucos os registros.
O que poderia ser? Uso Firebird.
Obrigado

SELECT PRODUTOS.CODIGO,
PRODUTOS.DESCRICAO as DESCRPRODUTO,
(Select sum (MOVIESTOQUE.QUANTIDADE)
from MOVIESTOQUE
Where MOVIESTOQUE.OPERACAO = ´E´
and PRODUTOS.CODIGO = MOVIESTOQUE.PRODUTO) as SubTotalEntrada,
(Select sum (MOVIESTOQUE.QUANTIDADE)
from MOVIESTOQUE
Where MOVIESTOQUE.OPERACAO = ´S´
and PRODUTOS.CODIGO = MOVIESTOQUE.PRODUTO) as SubTotalSaida
from PRODUTOS


Valdirdill

Valdirdill

Curtidas 0

Respostas

Lucas Silva

Lucas Silva

24/03/2004

Talvez seu banco de dados possa está corrompído.
Dê uma olhada no fórum de interbase, que lá tem a explicação de como reparar um BD!


GOSTEI 0
Rômulo Barros

Rômulo Barros

24/03/2004

Quais os componentes q tais utilizando? É da paleta DBExpress ?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

24/03/2004

tente utilizar ´apelidos´ para suas tabelas. acho que pode estar havendo uma confusão devido ao uso da mesma tabela 2 vezes com o mesmo nome.

tente alterar para:
SELECT PROD.CODIGO, PROD.DESCRICAO as DESCRPRODUTO,
        (Select sum (MOV_E.QUANTIDADE)
          from MOVIESTOQUE MOV_E
          Where MOV_E.OPERACAO = ´E´
          and MOV_E.PRODUTO = PROD.CODIGO) as SubTotalEntrada,
        (Select sum (MOV_S.QUANTIDADE)
          from MOVIESTOQUE MOV_S
          Where MOV_S.OPERACAO = ´S´
          and MOV_S.PRODUTO = PROD.CODIGO) as SubTotalSaida
from PRODUTOS
where....

ou:
SELECT PROD.CODIGO, PROD.DESCRICAO DESCRPRODUTO,
          sum(MOV_E.QUANTIDADE) SubTotalEntrada,
          sum(MOV_S.QUANTIDADE) SubTotalSaida,
from PRODUTOS PROD
left join MOVIESTOQUE MOV_E on (MOV_E.PRODUTO = PROD.CODIGO AND MOV_E.OPERACAO = ´E´)
left join MOVIESTOQUE MOV_S on (MOV_S.PRODUTO = PROD.CODIGO AND MOV_E.OPERACAO = ´S´)
where.....
group by PROD.CODIGO


GOSTEI 0
Ilopaiz

Ilopaiz

24/03/2004

Acho q o problema pode ser de falta de índices... veja quais campos vc está usando para selecionar a tabela e crie índice para cada um deles.... eu tinha uma consulta q demorava quase 10 minutos e com os índices certos passou a demorar 40 segundos....


GOSTEI 0
Weber

Weber

24/03/2004

Não é aconselhavel colocar um Select dentro de outro Select (se bem que eu faço isso sempre)

Vamos interpretar seu Select.

SELECT PRODUTOS.CODIGO, PRODUTOS.DESCRICAO as DESCRPRODUTO,
   (Select sum (MOVIESTOQUE.QUANTIDADE) from MOVIESTOQUE Where MOVIESTOQUE.OPERACAO = ´E´ and PRODUTOS.CODIGO = MOVIESTOQUE.PRODUTO) as SubTotalEntrada,
   (Select sum (MOVIESTOQUE.QUANTIDADE) from MOVIESTOQUE 
Where MOVIESTOQUE.OPERACAO = ´S´ and PRODUTOS.CODIGO = MOVIESTOQUE.PRODUTO) as SubTotalSaida
from PRODUTOS


Veja bem o que acontece, para cada produto da tabela Produtos são feitos mais dois Select na tabela MoviEstoque. Dessa forma se você 100 produtos são feitos 200 select´s na Tabela MoviEstoque. É por isso que acaba ficando lento.


GOSTEI 0
POSTAR