Trigger causando lentidão

seguinte: eu tenho uma tabela de lançamentos q controla a entrada e saida de valores de um determinado setor da empresa. como requisito do software tenho a necessidade de ter o saldo online entaum coloquei 3 trigers pra controlar esse saldo: 1 qdo deleta, 1 qdo insere e outro qdo update. Porém depois da inserção dos trigers o banco ficou lento e algumas veses tenho q reinicia-lo para q voltasse o banco. Alguem saberia como resolver isso, ou outra forma de fazer?

Você poderia dar mais informações sobre seu ambiente?

Qual banco de dados está utilizando?

Quantos registros possuem as tabelas envolvidas?

Assim que utilizou a solução das triggers este problema passou a acontecer ou aconteceu com o tempo?

Já rodou alguma ferramenta de profiler/tracer no banco de dados para ver o que ele está fazendo para demorar tanto?

A trigger calcula um saldo a cada atualização ou recalcula o saldo de todo mundo?

Acho que pode facilitar postar o código da trigger aqui.

Posta as classes Pojo do hibernate o código do insert no banco qual banco está usando e o código da trigger…

O servidor é um i3, 4Gb de ram, 250 gb de hd em raid 1, rede ethernet 100mb e wireless 54mb

MySQL 5.1.49

tab_lancamentos ~1200 e tab_saldo 5

Começou com um certo delay e foi aumentando até criar a necessidade de reiniciar o serviço.

não. Como faço isso?

Apenas de um setor. Por exemplo um usuário do setor financeiro faz um lançamento, então apenas o saldo do setor financeiro é atualizado.

Essa triger é a de inserção:

begin
        update tab_saldo S

        inner join tab_usuario U on U.codigo = New.usuario

        set S.saldo = S.saldo + NEW.entrada - new.saida

        where S.area = U.grupo;
end

Classe Lancamento

@Entity
@org.hibernate.annotations.Proxy(lazy = false)
@Table(name = "tab_lancamentos")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Lancamento implements Serializable {

    public Lancamento() {
    }
    @Column(name = "codigo", nullable = false)
    @Id
    @GeneratedValue(generator = "VC0A8646A12BC9F640E908A9A")
    @org.hibernate.annotations.GenericGenerator(name = "VC0A8646A12BC9F640E908A9A", strategy = "native")
    private long codigo;
    @Column(name = "dataLancamento", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private java.util.Date dataLancamento;
    @Column(name = "descricao", nullable = false, length = 255)
    private String descricao;
    @Column(name = "entrada", nullable = false)
    private double entrada;
    @Column(name = "saida", nullable = false)
    private double saida;
    @ManyToOne(targetEntity = Servico.class)
    @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK})
    @JoinColumns({
        @JoinColumn(name = "servico", referencedColumnName = "codigo")})
    @Basic(fetch = FetchType.EAGER)
    private Servico servico;
    @ManyToOne(targetEntity = Usuario.class)
    @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.LOCK})
    @JoinColumns({
        @JoinColumn(name = "usuario", referencedColumnName = "codigo")})
    @Basic(fetch = FetchType.LAZY)
    private Usuario usuario;

    //get e sets

Classe saldo

@Entity
@org.hibernate.annotations.Proxy(lazy=false)
@Table(name="tab_saldo")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Saldo implements Serializable {
	public Saldo() {
	}
		
	@Column(name="area", nullable=false)	
	@Id	
	private String area;
	
	@Column(name="saldo", nullable=false)	
	private double saldo;

a tabela de saldo não tem ligação alguma com a tab_lancamento.

vlw

Cara, analisando o código da sua trigger não achei nada que pudesse causar problemas.

Fiz um teste rodando aqui na minha máquina (inferior ao seu servidor) e roda normalmente.

Pra não ficar sem respostas te sugiro duas coisas:

  • Estude sobre profile no mysql pra conseguir verificar qual é seu problema.

Com um profile conseguirá analisar o que o banco está fazendo que causa o travamento.

  • Enquanto isso, transforme sua tabela de saldo, numa view…
    Pelo que entendi, essa tabela de saldo pode ser resumida como um SUM da diferença ENTRADA - SAIDA, agrupada por área, certo?
    Transformaria numa view até achar o problema efetivo com as triggers…
    Para sua quantidade de registros, não terá problemas de performance com isso.