[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