[firebase-br] Problema de performance no firebird 2.1
Arlei F. Farnetani Junior
junior em farsoft.com.br
Qua Abr 29 10:17:38 -03 2009
Pessoal, inacreditável...estamos (3 pessoas) só trabalhando nisto para
detectar o problema.
Colocamos o sistema no servidor e quando rodamos localmente nele o
processo de inserção
mais reload da tabela de itens...leva de 600 a 700milisegundos.
Agora se rodamos via terminal em 2 notebooks (um dual core e o outro
core 2 duo) o
sistema leva 142 a 200milisegundos.
Se rodamos em um terminal desktop core 2 duo com mais cache de
processador, hd mais
rapido e memoria de 2gb e mesmo sistema operacional o trem leva de 600 a
800milisegundos.
O QUE MAIS NOS SURPREENDE É QUE ATRAVÉS DE NOTEBOOKS (a média
é de 150 a 200 milisegundos). PENSAMOS ATÉ NA PLACA DE VIDEO MAS NÃO
É pq o desktop tem uma geforce boa.
Fiz o seguinte para mensurar o tempo isto...
var
pass:string;
Hour, Min, Sec, MSec:word;
t1,t2,t3:tdatetime;
begin
t1:=now;
pass:='S';
if Sender is TButton then
begin
if (strtoint(label_qtde.Caption)>10) then
begin
Screen.Cursor:=crdefault;
if pergunta('','Qtde>10', 'Você confirma mesmo esta
QTDE?'+#13+#13+label_qtde.caption)=6 then
begin
pass:='S';
Screen.Cursor:=crdefault;
end
else
pass:='N';
end;
if pass='S' then
begin
is_produtoMomento := THIGButton(Sender).tag;
DObs_Prod_id.DataSet.close;
Tclientdataset(dObs_Prod_id.dataset).params[0].asinteger :=
is_produtoMomento;
dObs_Prod_id.dataset.open;
frm_pesquisa_produtos.indice_busca := 'id_produto';
frm_pesquisa_produtos.nome_indice := 'Cód.Seq';
frm_pesquisa_produtos.ltLocaliza.Caption :=
frm_pesquisa_produtos.nome_indice + ':';
frm_pesquisa_produtos.sb2.Caption :=
frm_pesquisa_produtos.nome_indice + ':';
frm_pesquisa_produtos.montar_mascara;
frm_pesquisa_produtos.edtlocaliza.Text :=
inttostr(is_produtoMomento);
frm_pesquisa_produtos.executa_pesquisa;
//aqui não tem problema...o tempo é mto rapido...chega a 40
milisegundos (já isolei só esta função)
//aqui é pra executar a store procedure de inserção...antes eu estava
dando o insert direto no clientdataset...mas fiz isto pra melhorar.
dm_food.Store_Itens.close;
dm_food.Store_Itens.params[0].asdate:=dm_orcamento.tabeladata.value;
dm_food.Store_Itens.params[1].AsInteger:=dm.is_usuario;
dm_food.Store_Itens.params[2].asinteger:=dm.is_centrocustopadrao;
dm_food.Store_Itens.params[3].asstring:=dm_orcamento.tabelacfop.value;
dm_food.Store_itens.params[4].Asfloat:=dm_orcamento.tabelaid_orcamento.value;
dm_food.Store_Itens.params[5].AsInteger:=dm.idFilial;
dm_food.Store_Itens.params[6].asinteger:=dm_orcamento.tabelais_setorestoque.value;
dm_food.store_itens.params[7].asstring:='P';
dm_food.store_itens.params[8].asinteger:=is_produtoMomento;
dm_food.store_itens.params[9].AsString:=THIGButton(Sender).caption;
dm_food.store_itens.params[10].AsFloat:=strtoint(label_Qtde.caption);
dm_food.store_itens.params[11].AsCurrency:=frm_pesquisa_produtos.CDSpreco_embalagem.ascurrency;
dm_food.store_itens.params[12].AsCurrency:=frm_pesquisa_produtos.CDSpreco_custo.ascurrency;
dm_food.store_itens.params[13].AsCurrency:=frm_pesquisa_produtos.CDSpreco_custoreal.ascurrency;
dm_food.store_itens.params[14].Asinteger:=dm.is_usuario;
dm_food.store_itens.params[15].asstring:=frm_pesquisa_produtos.cdsgrupoproduto.value;
dm_food.store_itens.params[16].asstring:=frm_pesquisa_produtos.cdscodigo_interno.value;
dm_food.store_itens.params[17].asstring:=frm_pesquisa_produtos.cdsbarcode.value;
dm_food.store_itens.params[18].asstring:=frm_pesquisa_produtos.cdsmarca.value;
dm_food.store_itens.params[19].asfloat:=dm_food.SequencialMesaSEQUENCIAL.asfloat;
dm_food.store_itens.params[20].asinteger:=is_classemomento;
dm_food.store_itens.params[21].asfloat:=-1;
dm_food.Store_Itens.open;
dm_food.Store_Itens.ApplyUpdates(-1);
atualiza_totais; //aqui da um refresh nas tabelas (segue a
função abaixo)
end;
end;
t2:=now;
t3:=t2-t1;
DecodeTime(t3, Hour, Min, Sec, MSec);
BarraStatus.panels[7].text:=inttostr(hour)+':'+inttostr(min)+':'+inttostr(sec)+':'+inttostr(msec);
//fim
//função de atualizar os totais:
procedure TFrm_Food_Vendas.atualiza_totais;
begin
dm_food.itensfoodtela.refresh;
dm_food.itensfoodtela.first;
dm_orcamento.Total_Itens.refresh;
if dm_food.pedidos_agrupados.Active then
dm_food.Pedidos_Agrupados.Refresh;
label_subtotal.caption :=
floattostrf(dm_orcamento.Total_Itenstotal_bruto.ascurrency, ffnumber,
10, 2);
label_desconto.caption :=
floattostrf(dm_orcamento.Total_Itenstotal_descontos.AsCurrency,
ffnumber, 10, 2);
label_servico.caption :=
floattostrf(dm_orcamento.Total_Itenstotal_serv_garcom.ascurrency,
ffnumber, 10, 2);
label_total.Caption :=
floattostrf(dm_orcamento.Total_Itenstotal_liquido.ascurrency +
(dm_orcamento.Total_Itenstotal_serv_garcom.ascurrency), ffnumber, 10, 2);
label_qtde.caption:='1';
end;
// segue a store procedure de inserção que fiz pra ficar mais rapido
(melhour um pouco)
CREATE OR ALTER PROCEDURE INCLUIR_ITEM (
vdata date,
vis_pessoa integer,
vis_centrocusto integer,
vcfop varchar(5),
vis_orcamento double precision,
vis_filial integer,
vis_setorestoque integer,
vtipo varchar(1),
vcodigo integer,
vdescricao_item varchar(60),
vqtde numeric(8,3),
vpreco numeric(10,4),
vcusto numeric(10,4),
vcustomedio numeric(10,4),
vis_usuario integer,
vgrupo_item varchar(30),
vcodigo_int varchar(15),
vbarcode varchar(25),
vmarca varchar(11),
vsequencia double precision,
vis_classe integer,
vid_orcamentoitem double precision)
returns (
r integer)
as
declare variable id integer;
declare variable sentenca varchar(3000);
declare variable nomecampo varchar(100);
declare variable hora time;
begin
r=0;
id=0;
nomeCampo='GEN_ID_ITEMFOOD';
Sentenca = 'select cast(gen_id(' || :nomeCampo || ', 1) as
integer) from RDB$DATABASE';
execute statement Sentenca into :ID;
vid_orcamentoitem = id;
Sentenca ='select current_time from RDB$DATABASE';
execute statement Sentenca into :hora;
insert into ORCAMENTOS_ITENS
(id_orcamentoitem, hora, data, is_pessoa, is_centrocusto, cfop,
is_orcamento, is_filial, is_setorestoque, tipo, codigo,
descricao_item,
qtde, preco, custo, customedio, is_usuario, grupo_item, codigo_int,
barcode, marca, sequencia, is_classe)
VALUES (:vid_orcamentoitem, :hora, :vdata, :vis_pessoa,
:vis_centrocusto, :vcfop,
:vis_orcamento, :vis_filial, :vis_setorestoque, :vtipo, :vcodigo,
:vdescricao_item, :vqtde, :vpreco, :vcusto, :vcustomedio,
:vis_usuario,
:vgrupo_item, :vcodigo_int, :vbarcode, :vmarca, :vsequencia,
:vis_classe);
r=:vid_orcamentoitem;
suspend;
end
Mais detalhes sobre a lista de discussão lista