Urgent! Please analyze this piece of code

From: Marco Ribeiro <mar_at_bart.inescn.pt>
Date: Mon, 04 Jan 1999 14:13:38 +0000
Message-ID: <3690CC91.F0FAAE95_at_bart.inescn.pt>



Hi,

[Quoted] I'm including a C function from a data loading program in Pro*C. This function selects data from an Oracle 7.1 database on Unix machine, calls

some functions and inserts the data in an Oracle 7.3 database. The query

usually fetches a few hundred records. This process is very fast at first but it starts to lose performance until it's reduced to a crawl. I

noticed that it becomes very slow when it's executing the function calls

between the fetch and the insert.

Thanks,

Marco

void CarregaCCO()
{

 Local=1;

 printf("Carregamento de avarias do CCO %i\n",cco);

 EXEC SQL WHENEVER SQLERROR DO erro(ERROSQL);

 EXEC SQL AT BDLocal DECLARE AvariasCarregar CURSOR FOR   SELECT hist,
   hist2,
   anomalia,
   redist,
   anomes,
   radical,
   instal,
   cc,
   operacao,
   sub_operacao,
   status,
   servico,
   tipo_serv,
   origem,
   num_posto,
   prioridade,
   psup,
   nivel,
   segmento,
   sintoma,

   data_recepcao,
   hora_recepcao,
   data_ensaio,

   ensaio,
   data_dist_g,
   data_dist_i,
   hora_dist_i,

   equipa,
   acl,
   resolucao,
   data_reposicao,
   hora_reposicao,
   data_conclusao,
   hora_conclusao,

   topologia,
   orig_aplicacao,
   trab_simultaneo,
   tip_distr,
   def_distr,
   tmp_actuacao,
   tmp_deslocacao,
   tmp_previsto,

   ptr,
   tipo_ca,
   tipo_cc,
   cod_debbin,
   data_fecho
  FROM HIST
   WHERE CCO=:cco
     AND TO_DATE(DATA_CONCLUSAO,'J') BETWEEN TO_DATE(:data_inicio,'dd/mm/yyyy') AND TO_DATE(:data_fim,'dd/mm/yyyy');

 EXEC SQL OPEN AvariasCarregar;

 while(1) {

  EXEC SQL WHENEVER NOT FOUND DO break;

  EXEC SQL FETCH AvariasCarregar
    INTO :hist:ihist,
:hist2:ihist2,
:anomalia:ianomalia,
:redist:iredist,
:anomes:ianomes,
:radical:iradical,
:instal:iinstal,
:cc:icc,
:operacao:ioperacao,
:sub_operacao:isub_operacao,
:status:istatus,
:servico:iservico,
:tipo_serv:itipo_serv,
:origem:iorigem,
:num_posto:inum_posto,
:prioridade:iprioridade,
:psup:ipsup,
:nivel:inivel,
:segmento:isegmento,
:sintoma:isintoma,
:data_recepcao:idata_recepcao,
:hora_recepcao:ihora_recepcao,
:data_ensaio:idata_ensaio,
:ensaio:iensaio,
:data_dist_g:idata_dist_g,
:data_dist_i:idata_dist_i,
:hora_dist_i:ihora_dist_i,
:equipa:iequipa,
:acl:iacl,
:resolucao:iresolucao,
:data_reposicao:idata_reposicao,
:hora_reposicao:ihora_reposicao,
:data_conclusao:idata_conclusao,
:hora_conclusao:ihora_conclusao,
:topologia:itopologia,
:orig_aplicacao:iorig_aplicacao,
:trab_simultaneo:itrab_simultaneo,
:tip_distr:itip_distr,
:def_distr:idef_distr,
:tmp_actuacao:itmp_actuacao,
:tmp_deslocacao:itmp_deslocacao,
:tmp_previsto:itmp_previsto,
:ptr:iptr,
:tipo_ca:itipo_ca,
:tipo_cc:itipo_cc,
:cod_debbin:icod_debbin,
:data_fecho:idata_fecho;

  EXEC SQL AT BDLocal EXECUTE
   BEGIN
    :rc := geral.rede_cliente(:hist,:cco);     :dur_util_pt :=
Calchoras.duracao(:cco,:hist,null,null,null,null,null,'P','U',null);

    :dur_linear_pt :=

Calchoras.duracao(:cco,:hist,null,null,null,null,null,'P','L',null);
    :dur_util_cli :=
Calchoras.duracao(:cco,:hist,null,null,null,null,null,'C','U',null);

    :dur_linear_cli :=
Calchoras.duracao(:cco,:hist,null,null,null,null,null,'C','L',null);

   END;
  END-EXEC;

  /* ---------------------------------------------------------------

   Tratamento dos valores nulos dos campos:

    Topologia->1
    Serviço->0
    Sub_Operação->1
    Origem->0
    Prioridade->9
    Resolução->99
    Segmento->R

  • */
  if(itopologia==-1) { topologia=1; itopologia=1; }
  if(iservico==-1) { servico=0; iservico=1; }
  if(isub_operacao==-1) { sub_operacao=1; isub_operacao=1; }
  if(iorigem==-1) { origem=0; iorigem=1; }
  if(iprioridade==-1) { prioridade=9; iprioridade=1; }
  if(iresolucao==-1) { resolucao=99; iresolucao=1; }
  if(isegmento==-1) {

   strcpy(segmento.arr,"R");
   segmento.len=strlen(segmento.arr);
   isegmento=1;
  }
  /* ---------------------------------------------------------------

   Tratamento dos valores nulos das datas:

    Data Conclusão
    Data de Fecho
    Data de Recepção
    Data de Ensaio
    Data_Dist_G
    Data_Dist_I
    Data de Reposição

  • */

  EXEC SQL AT BDCentral EXECUTE
   BEGIN
    IF :data_conclusao:idata_conclusao IS NULL THEN
:cdata_conclusao:icdata_conclusao := NULL;
    ELSE
:cdata_conclusao:icdata_conclusao :=
TO_DATE(:data_conclusao:idata_conclusao,'J');

    END IF;     IF :data_fecho:idata_fecho IS NULL THEN
:cdata_fecho:icdata_fecho := NULL;
    ELSE
:cdata_fecho:icdata_fecho := TO_DATE(:data_fecho:idata_fecho,'J');
    END IF;     IF :data_recepcao:idata_recepcao IS NULL THEN
:cdata_recepcao:icdata_recepcao := NULL;
    ELSE
:cdata_recepcao:icdata_recepcao :=
TO_DATE(:data_recepcao:idata_recepcao,'J');

    END IF;     IF :data_ensaio:idata_ensaio IS NULL THEN
:cdata_ensaio:icdata_ensaio := NULL;
    ELSE
:cdata_ensaio:icdata_ensaio :=

TO_DATE(:data_ensaio:idata_ensaio,'J');

    END IF;     IF :data_dist_g:idata_dist_g IS NULL THEN
:cdata_dist_g:icdata_dist_g := NULL;
    ELSE
:cdata_dist_g:icdata_dist_g :=

TO_DATE(:data_dist_g:idata_dist_g,'J');

    END IF;     IF :data_dist_i:idata_dist_i IS NULL THEN
:cdata_dist_i:icdata_dist_i := NULL;
    ELSE
:cdata_dist_i:icdata_dist_i :=

TO_DATE(:data_dist_i:idata_dist_i,'J');

    END IF;     IF :data_reposicao:idata_reposicao IS NULL THEN
:cdata_reposicao:icdata_reposicao := NULL;
    ELSE
:cdata_reposicao:icdata_reposicao :=
TO_DATE(:data_reposicao:idata_reposicao,'J');

    END IF;
   END;
  END-EXEC;   EXEC SQL AT BDCentral
    INSERT INTO AVARIAS

            (hist,
       zona,
       cco,
       status,
       data_fecho,
       resolucao,
       prioridade,
       servico,
       segmento,
       origem,
       hist2,
       anomalia,
       redist,
       anomes,
       radical,
       instal,
       cc,
       operacao,
       sub_operacao,
       num_posto,
       psup,
       nivel,
       sintoma,
       data_recepcao,
       hora_recepcao,
       data_ensaio,
       ensaio,
       data_dist_g,
       data_dist_i,
       hora_dist_i,
       equipa,
       acl,
       data_reposicao,
       hora_reposicao,
       data_conclusao,
       hora_conclusao,
       topologia,
       orig_aplicacao,
       trab_simultaneo,
       tip_distr,
       def_distr,
       tmp_actuacao,
       tmp_deslocacao,
       tmp_previsto,
       ptr,
       tipo_ca,
       tipo_cc,
       cod_debbin,
       tipo_serv,
      rc,
      dur_util_pt,
      dur_linear_pt,
      dur_util_cli,
      dur_linear_cli)
     values (:hist,
      :zona,
      :cco,
      :status,
      :cdata_fecho:icdata_fecho,
      :resolucao:iresolucao,
      :prioridade:iprioridade,
      :servico:iservico,
      :segmento:isegmento,
      :origem:iorigem,
      :hist2:ihist2,
      :anomalia:ianomalia,
      :redist:iredist,
      :anomes:ianomes,
      :radical:iradical,
      :instal:iinstal,
      :cc:icc,
      :operacao:ioperacao,
      :sub_operacao:isub_operacao,
      :num_posto:inum_posto,
      :psup:ipsup,
      :nivel:inivel,
      :sintoma:isintoma,
      :cdata_recepcao:icdata_recepcao,
      :hora_recepcao:ihora_recepcao,
      :cdata_ensaio:icdata_ensaio,
      :ensaio:iensaio,
      :cdata_dist_g:icdata_dist_g,
      :cdata_dist_i:icdata_dist_i,
      :hora_dist_i:ihora_dist_i,
      :equipa:iequipa,
      :acl:iacl,
      :cdata_reposicao:icdata_reposicao,
      :hora_reposicao:ihora_reposicao,
      :cdata_conclusao:icdata_conclusao,
      :hora_conclusao:ihora_conclusao,
      :topologia:itopologia,
      :orig_aplicacao:iorig_aplicacao,
      :trab_simultaneo:itrab_simultaneo,
      :tip_distr:itip_distr,
      :def_distr:idef_distr,
      :tmp_actuacao:itmp_actuacao,
      :tmp_deslocacao:itmp_deslocacao,
      :tmp_previsto:itmp_previsto,
      :ptr:iptr,
      :tipo_ca:itipo_ca,
      :tipo_cc:itipo_cc,
      :cod_debbin:icod_debbin,
      :tipo_serv:itipo_serv,
      :rc,
      :dur_util_pt,
      :dur_linear_pt,
      :dur_util_cli,
      :dur_linear_cli);

    EXEC SQL AT BDCentral INSERT INTO DIAS_CALCULAR (data)
     VALUES(:cdata_conclusao:icdata_conclusao);

    EXEC SQL AT BDCentral COMMIT;

 }

 EXEC SQL CLOSE AvariasCarregar;

} Received on Mon Jan 04 1999 - 15:13:38 CET

Original text of this message