[firebase-br] Performance Inclusão Massa x Trigger x Tabelas

Valdemir (gmail) valdemirjs em gmail.com
Ter Dez 4 14:43:19 -03 2012


Boa tarde carlos, demorei a responder pq estava com um problema aqui, e tive 
que resolve-lo

Preparei um banco de dados para ilustrar o que eu quiz dizer, talves não 
tenha sido claro.

No link
http://www.4shared.com/rar/yopHWFpo/banco.html
ou
http://sharex.xpg.com.br/files/3879733901/banco.rar.html

tem o banco de dados com select na trigger e sem select na trigger, e também 
tem o script, para inclusão dos registros no banco de dados

o teste que eu fiz foi usando o firebird 2.1 e IBExpert
note que no banco de dados, a trigger existe apenas para dar um select na 
tabela historico caixa, note que eu usei no where do select o campo que é a 
pk da tabela, e que na primeira linha da trigger tem a condição if 1=1 then 
exit. justamente para não executar o codigo da trigger

O tempo para executar a inclusão no banco sem a trigger
7 s 688 para incluir

e no banco com a trigger
15s 593 ms

note que o tempo aumenta, só por causa da trigger que da select na tabela 
historico caixa, na verdade a trigger existe, na primeira linha da trigger 
já dou um exit, ou seja o select mesmo usando a PK nunca é executado

-----Mensagem Original----- 
From: Carlos H. Cantu
Sent: Friday, November 30, 2012 4:48 PM
To: FireBase
Subject: Re: [firebase-br]Performance Inclusão Massa x Trigger x Tabelas

Vg> Mas pelo que eu vi, o firebird, verifica que na trigger carrega 
informação
Vg> da tabela clientes, e ai acho que faz algum processo para deixar mas 
rapido
Vg> a trigger se ele passar pelo codigo.

Não existe isso. O código do seu exemplo é executado muito rapidamente
se o campo ID estiver indexado na tabela de clientes. Você
dificilmente notará qualquer diferença de performance com o uso
"normal" do sistema.

Além disso, com o decorrer do uso do banco de dados, tanto o cache do
firebird como o cache do sistema operacional vai sendo preenchido,
deixando as consultas ainda mais rápidas pois não há leitura no HD.

[]s
Carlos H. Cantu
www.FireBase.com.br - www.firebirdnews.org
www.warmboot.com.br - blog.firebase.com.br

Vg> Gladiston

Vg> Eu sempre nunca entendi bem mesmo como que os "caras do SQL", fazem 
magica,
Vg> de deixar uma aplicação com um unico arquivo enorme, ficar mais rapida 
do
Vg> que em arquivos pequenos separados por tabelas, sou da epoca do clipper 
e
Vg> DBF.

Vg> Acredito que o firebird, deve fazer algum cache, quando uma trigger usa 
mais
Vg> de uma tabela, eu na minha ignorancia, pensava que o fato de proteger um
Vg> codigo em uma trigger não causaria lendição.. Ex

Vg> Supondo que seja necessario ferificar se o cliente tem saldo disponivel
Vg> quando ele faz uma compra a prazo, para isso deve-se fazer uma consulta 
na
Vg> tabela de clientes pelo campo LimiteDisponivel

Vg> na trigger before insert da tabela de vendas pensaria em fazer o 
seguinte

If valorPrazo >> 0
Vg>     Select limitedisponivel from clientes where id = :parid into limite
Vg>     if ValorPrazo > limite
Vg>         Expception 'limite indisponivel'
Vg>     End
Vg> End

Vg> O codigo acima foi apenas para estudo provavelmente tem falhas ao 
compilar a
Vg> trigger, mas enfim usando a logia acima, ele irá consultar a tabela de
Vg> clientes apenas se o valorprazo > 0, ou seja na minha ignorancia de
Vg> desenvolvedor, se o valor sempre for a vista, ele nunca passara pelo 
codigo,
Vg> e teoricamente ele não vai causar queda de performance a não ser se a 
venda
Vg> seja a prazo.

Vg> Mas pelo que eu vi, o firebird, verifica que na trigger carrega 
informação
Vg> da tabela clientes, e ai acho que faz algum processo para deixar mas 
rapido
Vg> a trigger se ele passar pelo codigo.

Vg> Este processo na vesão 2.5 será que esta mais inteligente ? , tipo ele
Vg> verifica que o valor prazo não é maior que zero e ai nem perde tempo
Vg> verificando o resto nem carregando em cache informações da tabela 
cliente ?


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista