Importar imensa qtdade de dados de um txt.
06/12/2005
0
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
Posts
07/12/2005
Motta
Estas tabelas tem triggers ? Constraints ?
07/12/2005
Eniorm
abraço
08/12/2005
José Cordeiro
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!
08/12/2005
José Cordeiro
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
08/12/2005
José Cordeiro
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
Clique aqui para fazer login e interagir na Comunidade :)