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?
Trigger causando lentidão
4 Respostas
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.