06/12/2005

Importar imensa qtdade de dados de um txt.

Boa tarde pessoal.

tenho que fazer uma importação de dados de um txt para o sql server 2000.. mas queria ver se tem uma maneira um pouco mais rápida de fazer..

tenho um arquivo para baixar com 16.378.792 registros..éee isso mesmo 16 milhões 378 mil 792 registros.. uma paulada de registros..

fiz uma rotina mas que em 4 horas ela baixou 180.000 registros.. por isso tenho que fazer algo mais rápido se der..

tenho a seguinte rotina(segmento)
8: // importar VEÍCULOS
begin
try
begin
Reset(F);
dados.VEICULOS.Open;
while not eof(F) do
begin
Readln(F,xlinha);
xcp01:=copy(xlinha,1,7);
xcp02:=copy(xlinha,8,1);
xcp03:=copy(xlinha,9,4);
xcp04:=copy(xlinha,13,4);
xcp05:=copy(xlinha,17,6);
xcp06:=copy(xlinha,23,2);
xcp07:=copy(xlinha,25,2);
xcp08:=copy(xlinha,27,3);
xcp09:=copy(xlinha,30,4);
xcp10:=copy(xlinha,34,1);
strsql:=´execute importa_veiculos ´;
strsql:=strsql+quotedstr(xcp01)+´,´;
strsql:=strsql+quotedstr(xcp02)+´,´;
strsql:=strsql+quotedstr(xcp03)+´,´;
strsql:=strsql+quotedstr(xcp04)+´,´;
strsql:=strsql+quotedstr(xcp05)+´,´;
strsql:=strsql+quotedstr(xcp06)+´,´;
strsql:=strsql+quotedstr(xcp07)+´,´;
strsql:=strsql+quotedstr(xcp08)+´,´;
strsql:=strsql+quotedstr(xcp09)+´,´;
strsql:=strsql+quotedstr(xcp10);
dados.CNN.Execute(strsql);
GAUGE.Progress:=GAUGE.Progress+1;
end;

onde dados é um datamodule
CNN é um ADOCOnnection..

a minha procedure é a seguinte:

CREATE PROCEDURE IMPORTA_VEICULOS
@PLACA CHAR(7),
@CATEGORIA CHAR(1),
@MUNICIPIO CHAR(4),
@MARCA_CET CHAR(4),
@MARCA_DENATRAN CHAR(6),
@TIPO_VEIC_CET CHAR(2),
@TIPO_VEIC_DENATRAN CHAR(2),
@COR CHAR(3),
@ANOMODELO CHAR(4),
@TIPO_REG CHAR(1)
AS
IF NOT EXISTS(SELECT * FROM VEICULOS WHERE PLACA=@PLACA)
BEGIN
INSERT INTO VEICULOS
(PLACA,CATEGORIA,MUNICIPIO,MARCA_CET,MARCA_DENATRAN,TIPO_CET,TIPO_DENATRAN,COR,ANO_MODELO,TIPO_REG)
VALUES
(@PLACA,@CATEGORIA,@MUNICIPIO,@MARCA_CET,@MARCA_DENATRAN,@TIPO_VEIC_CET,@TIPO_VEIC_DENATRAN,@COR,@ANOMODELO,@TIPO_REG)
END
ELSE
BEGIN
UPDATE VEICULOS
SET
PLACA=@PLACA,
CATEGORIA=@CATEGORIA,
MUNICIPIO=@MUNICIPIO,
MARCA_CET=@MARCA_CET,
MARCA_DENATRAN=@MARCA_DENATRAN,
TIPO_CET=@TIPO_VEIC_CET,
TIPO_DENATRAN=@TIPO_VEIC_DENATRAN,
COR=@COR,
ANO_MODELO=@ANOMODELO,
TIPO_REG=@TIPO_REG
WHERE PLACA=@PLACA
END
GO


então é isso.. sei que tá meio complicado,mas se puderem me ajudar ficaria mto agradecido..

mto obrigado
Eric


Eric.miranda

Respostas

07/12/2005

Motta

O Oracle tem o loader , o sql não sei se tem algo semelhante, deve ter.

Estas tabelas tem triggers ? Constraints ?


Responder Citar

07/12/2005

Eniorm

tenta abrir o txt no Access, ele pedirá pra vc configurar as colunas, separadores etc..... após isso nomeie os campos e salve no formado MDB ou em algum outro que o sql server possa importar, do contrário vc tera que fazer um aplicativo para ler da base de dados origem (access) e inserir no destino (sql server)

abraço


Responder Citar

08/12/2005

José Cordeiro

O SQL Server tem uma ferramenta, sim. Não me lembro o nome, mas já usei há alguns anos. O Delphi também tinha uma ferramenta - Data Pump _ pelo menos até a versão 4. Funcionava muito bem (padrão Borland)!

A questão que envolve uma ferramenta destas é a (falta de)crítica dos dados. Já fiz Muitas migrações de dados (alguns milhões de registros) e, no final das contas, sempre era melhor tratar registro a registro.

Você deve estar usando uma stored proc para executar este trabalho, e passando para ela dados ´mastigados´ (Não analisei sua rotina).

Seria muito interessante dividir esta massa gigantes em (muitos) outros arquivos menores (dez mil registros, por exemplo). Poderia, assim, submeter a tarefa a partir de vários computadores (entendendo que o servidor deve ser MUITO potente e ficaria ocioso ao atender um único cliente menos poderoso). E fica melhor de administrar, sem dúvida.

Creia-me: este trabalho preparatório não seria gasto, mas investimento com retorno garantido.

Boa sorte!


Responder Citar

08/12/2005

José Cordeiro

Completando:
a) try except gasta muito tempo (vi no seu código);
b) exibição de contadores no vídeo também;
c) stored procedures fazem MUITA diferença de velocidade.

Novamente, boa sorte!

Henrique


Responder Citar

08/12/2005

José Cordeiro

Finalmente:

Você precisa usar TODOS os campos para se certificar que o registro não está cadastrado? Pequenos detalhes em uma massa de dados pequena não fazem muita diferença. Mas neste seu caso, seja rígido!

Outra coisa: evite rotinas interpretadas em tempo de execução (parece-me ser o caso deste select).

Não me lembro para que serve aquele @. Mas se for algo que demande tempo, retire também.

[]s

Henrique


Responder Citar