Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   cargar plano txt en tabla sql server desde delphi 6 (https://www.clubdelphi.com/foros/showthread.php?t=64584)

HELBERT GARCIA 08-04-2009 16:09:34

cargar plano txt en tabla sql server desde delphi 6
 
Neftali, necesito cargar un plano.txt a una tabla sql server de 200.000 registros a una velocidad conciderable, pues el proceso que utilizo actualmente me tarda hora y necesito minutos 5 tal vez.

creo que tu tienes la experiencia y muy seguramente me puedas ayudar a solucionar este problema.
te lo agradezco

Neftali [Germán.Estévez] 08-04-2009 16:18:34

Hola Helbert, bienvenido a los foros.

Aunque yo sea el Administrador de los foros, piensa que hay muchas más gente que sabe del tema y te aseguro que muchos de ellos bastante más que yo. ;)

Para comprender lo que estás haciendo y cómo se puede mejorar, primero debes explicar cómo estás haciendo actualmente la importación de Datos desde la tabla plana a SQL Server.

¿Lo estás haciendo desde un programa Delphi? ¿Qué componentes estás utilizando? ¿Utilizas transacciones?

Estaría bien que colocaras algo de código.

Neftali [Germán.Estévez] 08-04-2009 16:38:41

Hola.
Acabo de hacer una sencilla prueba de importar utilizando ADO, 10.000 registros desde un fichero plano a una tabla de SQL Server (servidor remoto) y tarda apenas 20 sg.

Así que estaría bien que describieras cómo estás haciendo el proceso.

NOTA: Para el fichero TXT he accedido con un ADOTable y el driver de Jet4.
NOTA: Para la tabla de SQL Server otro ADOTable.

HELBERT GARCIA 08-04-2009 16:56:43

Neftali, gracias por responder
estoy utilizando este codigo delphi en el cual para insertar los campos a la tabla lo hagopor un procedimiento almacenado llamado Splanoswinsiob

Código Delphi [-]
 
procedure TFrmplanoWinsiob.BitBtn1Click(Sender: TObject);
var
F: TextFile;
cadena:string;
i : Integer;
begin
NomPlanoToImp := Trim(edtArchivo.Text);
if Archivo <> nil then
  Begin
    Archivo.Clear;
    Archivo.LoadFromFile(NomPlanoToImp);
    reArchivo.Lines.LoadFromFile(NomPlanoToImp);
  End;
  if reArchivo.Lines.Count = 0 then
  Begin
    ShowMessage('No a definido el archivo a LEER');
    Exit;
  End;
  if MessageDlg('Seguro de LEER datos ?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
   begin
     AssignFile(F,edtArchivo.Text);  
   end;
  try
    for i:=1 to Archivo.Count-2 do
    Begin
      Cadena := Archivo.Strings[i];
   with  Splanoswinsiob do
     begin
      params[0].Asstring :=Copy(Cadena,1,9);
      params[1].Asstring :=Copy(Cadena,10,13);
      params[2].Asstring :=Copy(Cadena,14,21);
      params[3].Asstring:=Copy(Cadena,22,36);
      params[4].Asstring:=Copy(Cadena,37,51);
      params[5].Asstring:=Copy(Cadena,52,53);
      params[6].Asstring:=Copy(Cadena,54,55);
      params[7].Asstring:=Copy(Cadena,56,57);
      params[8].Asstring:=Copy(Cadena,58,72);
      params[9].Asstring :=Copy(Cadena,73,112);
      params[10].Asstring :=Copy(Cadena,113,137);
      params[11].Asstring :=Copy(Cadena,138,140);
      params[12].Asstring :=Copy(Cadena,141,144);
      params[13].Asstring :=Copy(Cadena,145,152);
      params[14].Asstring :=Copy(Cadena,153,162);
      params[15].Asstring := Copy(Cadena,163,166);
      params[16].Asstring :=Copy(Cadena,167,206);
      params[17].Asstring :=Copy(Cadena,207,221);
      params[18].Asstring :=Copy(Cadena,222,246);
      params[19].Asstring :=Copy(Cadena,247,249);
      params[20].Asstring :=Copy(Cadena,250,250);
      params[21].Asstring :=Copy(Cadena,251,270);
      params[22].Asstring :=Copy(Cadena,271,311);
      params[23].Asstring :=Copy(Cadena,312,327);
      params[24].Asstring :=Copy(Cadena,328,370);
      ExecProc;
      end;
          end;
          except
      raise;
  end;

Neftali [Germán.Estévez] 08-04-2009 17:28:36

Para posteriores mensaje utiliza TAG's cuando pongas código Delphi, verás que se lee mejor.
Este ya te lo modifico yo.

Neftali [Germán.Estévez] 08-04-2009 17:53:24

Cita:

Empezado por HELBERT GARCIA (Mensaje 344379)
Neftali, gracias por responder estoy utilizando este codigo delphi en el cual para insertar los campos a la tabla lo hagopor un procedimiento almacenado llamado Splanoswinsiob

Hola Helbert. Pues he probado un código similar al tuyo porque tenía dudas sobre los Copy, pero el tiempo total de insertar 10.000 registros ha sido similar al anterior; Unos 20 segundos. Cosa que me hace pensar que no va por aquí la lentitud. Deberías mirar qué hace exactamente el StoredProc. También el tema de Red. Puedes poner una marca de tiempo después de cada insert para estimar qué está tardando en hacer una vuelta del bucle.

HELBERT GARCIA 08-04-2009 18:53:28

este es el procedimiento que estoy usando

CREATE PROCEDURE spplanowinsiob
(
@conse char (9),--0
@cod_suc char (4),--1
@fec_operacion char (8),--2
@vlr_nominal char(15),--3
@vlr_pesos char (15),--4
@tip_moneda char (2),--5
@form_pago char (2),--6
@tip_iden char (2),--7
@num_iden char (15),--8
@nom_razsoc char (40),--9
@dir_eccion char (25),--10
@cod_depart char (3),--11
@cod_munic char (4),--12
@cod_inditel char (8),--13
@num_tel char (10),--14
@tip_transac char (4),--15
@nom_remit char (40),--16
@n_idremit char (15),--17
@tp_idremit char (25),--18
@pais_orig char (3),--19
@Ori_desti char (1),--20
@ciuor_dest char (20),--21
@entidad char (40),--22
@num_cuenb char (16),--23
@detalle char (43)--24
)
AS
begin
Insert into PLANOWINSIOB(conse,cod_suc,fec_operacion,vlr_nominal,vlr_pesos,tip_moneda,
form_pago,tip_iden,num_iden,nom_razsoc,dir_eccion,cod_depart,cod_munic,cod_inditel,
num_tel,tip_transac,nom_remit,n_idremit,tp_idremit,pais_orig,Ori_desti,ciuor_dest,
entidad,num_cuenb,detalle)
Values (@conse,@cod_suc,@fec_operacion,@vlr_nominal,@vlr_pesos,@tip_moneda,
@form_pago,@tip_iden,@num_iden,@nom_razsoc,@dir_eccion,@cod_depart,@cod_munic,@cod_inditel,
@num_tel,@tip_transac,@nom_remit,@n_idremit,@tp_idremit,@pais_orig,@Ori_desti,@ciuor_dest,
@entidad,@num_cuenb,@detalle)
end
GO

HELBERT GARCIA 08-04-2009 18:55:18

estoy utilizando un StoredProc no un ADOStoredProc

HELBERT GARCIA 08-04-2009 19:33:58

ya lo resolvi, gracias

Faust 08-04-2009 23:48:16

Cita:

Empezado por HELBERT GARCIA (Mensaje 344434)
ya lo resolvi, gracias

Pero dinos ¿como? :confused:

Neftali [Germán.Estévez] 08-04-2009 23:55:35

Cita:

Empezado por HELBERT GARCIA (Mensaje 344434)
ya lo resolvi, gracias

¿Dónde estaba el problema de lentitud?
Sería interesante saberlo para posteriores consultas.

HELBERT GARCIA 13-04-2009 15:35:05

estaba utilizando una conexion BDE la cambie por ADO y envie el procedimiento correspondiente a este y funciono: antes cargado 200.000 registros se demoraba 3 horas ahora lo hace en 7 minutos

Gracias


La franja horaria es GMT +2. Ahora son las 10:49:51.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi