[firebase-br] Importação de TXT para FB, lenta...

Moacir - GMail prismars em gmail.com
Ter Set 29 13:14:06 -03 2009


Mr. Marshall,

Minha conclusão é fundamentada na experiencia e tb na leitura do 
material disponivel na web sobre Banco de Dados, especialmente o firebird.

Ficará realmente  rapida se vc fizer da forma que sugeri inicialmente, 
ou seja:
//-- Fora do laço WHILE !!
   DM->IBQuery1 ->Close();
   DM->IBQuery1 ->SQL->Clear();
   DM->IBQuery1 ->SQL->Add( AnsiString("INSERT INTO CLIENTES 
(NOMECLIENTE) VALUES (:NOMECLIENTE)"));

//-- Dentro do Laço While..
  try
  {
   DM->IBQuery1 ->ParamByName("NOMECLIENTE")->AsString  =  NOMECLIENTE;
   DM->IBQuery1 ->ExecSQL();
  }
  catch(...)
  {

  }


Tente assim como coloquei e me diga como ficou.

Sucesso !!

Moacir



Mr. Marshall escreveu:
> Moacir
>
> Obrigado pela dica.
>
> Eu conduzi testes aqui e confirmei que a inclusão direto na tabela é 
> mais rápida.
>
> O código abaixo levou 00:01:11 para incluir 76834 registros.
>   try
>   {
>    DM->IBQuery1 ->Close();
>    DM->IBQuery1 ->SQL->Clear();
>    DM->IBQuery1 ->SQL->Add( AnsiString("INSERT INTO CLIENTES 
> (NOMECLIENTE) VALUES (:NOMECLIENTE)"));
>    DM->IBQuery1 ->ParamByName("NOMECLIENTE")->AsString  =  NOMECLIENTE;
>    DM->IBQuery1 ->ExecSQL();
>   }
>   catch(...)
>   {
>
>   }
>
> O código abaixo levou 00:01:05 para incluir 76834 registros.
>   try
>   {
>      DM->IBTable1->Append();
>      DM->IBTable1->FieldValues["NOMECLIENTE"] = NOMECLIENTE;
>      DM->IBTable1->Post();
>   }
>   catch(...)
>   {
>       DM->IBTable1->Delete();
>   }
>
>
> Você realizou testes ou sua conclusão é impirica ?
>
> OBS : Unidirecional = false acelera o processo, principalmente na Query
>
>
>
>
> "Moacir - GMail" <prismars em gmail.com> wrote in message 
> news:4AC207F6.9050707 em gmail.com...
> Mr. Marshall,
>
> Uma sugestão:
>
> - Substitua o uso de Tables por Querys , com isto vc já estara obterá
> ganho de velocidade.
>
> Por Ex.:
>
> if((arqRead = fopen("clientes.txt"),"rt")) == NULL)
> {
>   ShowMessage("Problema ao abrir o arquivo de importação plano.");
> }
> //-- AQUI
> With DM->IBQuery1 do
> begin
>    SQL.text:='Insert into MinhaTabela (NOMECLIENTE) values (:NOME)';
> end;
> //---------------
> fseek(arqRead, 0, SEEK_SET);
> while (!feof(arqRead))
> {
>    fgets(str, 2048, arqRead);
>    StrAnsi = AnsiString(str);
>    //-- AQUI
>    With DM->IBQuery1 do
>     begin
>          ParamByName('NOME').AsString := StrAnsi;
>          ExecQuery;
>     end;
>
>     a cada 1000 da uma commit e reabre banco
>     DM->IBTransaction1->Commit();
>     DM->IBTransaction1->Active = true;
> }
> fclose(arqRead);
>
> Sucesso !!
>
> Moacir
>
> Mr. Marshall escreveu:
>> Qual a maneira mais rápida de fazer uma importação de um arquivo textto
>> contendo registros ?
>>
>> Tenho um arquivo com dois milhões de registros que sempre vou precisar
>> importar para dento do FB, tenho varrido este arquivo do inicio ao fim e
>> tenho colocado os campos direto na tabela e a cada 100 mil faço um 
>> COMMIT
>>
>>  if((arqRead = fopen("clientes.txt"),"rt")) == NULL)
>>  {
>>    ShowMessage("Problema ao abrir o arquivo de importação plano.");
>>  }
>>  fseek(arqRead, 0, SEEK_SET);
>>  while (!feof(arqRead))
>>  {
>>     fgets(str, 2048, arqRead);
>>     StrAnsi = AnsiString(str);
>>      DM->IBTable1->Append();
>>      DM->IBTable1->FieldValues["NOMECLIENTE"] = StrAnsi ;
>>      DM->IBTable1->Post();
>>
>>      a cada 1000 da uma commit e reabre banco
>>      DM->IBTransaction1->Commit();
>>      DM->IBTransaction1->Active = true;
>> }
>> fclose(arqRead);
>>
>> Está técnica funciona mas tem se demonstrado meio lenta, alguma sujestão
>> para melhorar a performance da importação ?
>>
>>
>> Mr. Marshall
>> PS:
>> Já li o artigo do Cantú sobre importação de TXT utilizando a técnica 
>> de EXTERNAL FILE mas preciso fazer verificações antes de incluir os 
>> dados poderia utilizar UDF mas...
>>
>




Mais detalhes sobre a lista de discussão lista