[firebase-br] Lentidao em Base de dados Grande

Rodrigo dominio em engeplus.com.br
Sex Jan 22 19:10:46 -03 2010


Eduardo, acho que achei o problema, acho que esta nessa trigger:


CREATE TRIGGER IT_PEDIDO_ESTOQUE FOR ITENS
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
DECLARE VARIABLE ENTRADA CHAR(1);
DECLARE VARIABLE TIPO CHAR(1);
BEGIN
IF (INSERTING) THEN BEGIN
SELECT ENTRADA FROM ITENS WHERE SEQUENCIAL=New.Sequencial // nessa linha 
pesquiso no banco de dados da tabela itens, quase 800000 registros para 
achar se entrada é 'S' ou 'N')
INTO :ENTRADA;
if (ENTRADA = 'S') then
UPDATE PRODUTOS SET PRODUTOS.DATAUAT=CURRENT_DATE, PRODUTOS.ESTOQUEU2 = 
COALESCE(PRODUTOS.ESTOQUEU2,0) - NEW.QTDU2 WHERE PRODUTOS.CODIGO = 
NEW.CODIGOPRODUTO AND NEW.TIPO='P' AND (NEW.TIPOVENDA='V' OR 
NEW.TIPOVENDA='O' OR NEW.TIPOVENDA='H');
if (ENTRADA = 'E') then
UPDATE PRODUTOS SET PRODUTOS.DATAUAT=CURRENT_DATE, PRODUTOS.ESTOQUEU2 = 
COALESCE(PRODUTOS.ESTOQUEU2,0) + NEW.QTDU2 WHERE PRODUTOS.CODIGO = 
NEW.CODIGOPRODUTO AND NEW.TIPO='P' AND (NEW.TIPOVENDA='V' OR 
NEW.TIPOVENDA='O' OR NEW.TIPOVENDA='H');
END ELSE
IF (UPDATING) THEN BEGIN
SELECT ENTRADA FROM ITENS WHERE SEQUENCIAL=New.Sequencial  // nessa linha 
pesquiso no banco de dados da tabela itens, quase 800000 registros para 
achar se entrada é 'S' ou 'N')
INTO :ENTRADA;
if (ENTRADA = 'S') then
UPDATE PRODUTOS SET PRODUTOS.DATAUAT=CURRENT_DATE, PRODUTOS.ESTOQUEU2 = 
COALESCE(PRODUTOS.ESTOQUEU2,0) - NEW.QTDDESC WHERE PRODUTOS.CODIGO = 
NEW.CODIGOPRODUTO AND NEW.TIPO='P' AND (NEW.TIPOVENDA='V' OR 
NEW.TIPOVENDA='O' OR NEW.TIPOVENDA='H');
if (ENTRADA = 'E') then
UPDATE PRODUTOS SET PRODUTOS.DATAUAT=CURRENT_DATE, PRODUTOS.ESTOQUEU2 = 
COALESCE(PRODUTOS.ESTOQUEU2,0) + NEW.QTDDESC WHERE PRODUTOS.CODIGO = 
NEW.CODIGOPRODUTO AND NEW.TIPO='P' AND (NEW.TIPOVENDA='V' OR 
NEW.TIPOVENDA='O' OR NEW.TIPOVENDA='H');
END
END
;

nessa trigger eu faço um select na tabela itens para verificar se é 
considerado entrada ou saida da mercadoria no estoque.

ex. se é uma venda coloco "S" no entrada e o sistema vai saber que é para 
diminuir um do estoque, se for devolução "E" vai entrar um no estoque.

testando esse select ele chega a quase 2 segundos só nele, por isso acho que 
esta lento?

Na sua opniao, como vc acha que devo fazer esse controle?, ja quebrei a 
cabeça aqui e nao estou conseguindo achar outro meio...

Grato,

Rodrigo 





Mais detalhes sobre a lista de discussão lista