[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