[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