Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-10-2010
acalderonr acalderonr is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico, DF
Posts: 33
Poder: 0
acalderonr Va por buen camino
Insertar 450,000 de un golpe.

Hola a todos. He buscado algo que me oriente en los foros y no encuentro exactamente lo que me gustaría hacer.

Estoy haciendo una aplicación para administración de Vales, pero de cada vale necesito ciertos campos y un registro independiente vale por vale, por tanto, mi cliente recibe de entrada 450,000 vales en diferentes denominaciones, pero necesito, por tanto, agregar un registro por cada folio de vale.

Estoy usando Delphi 6, Firebird 2.1 con los componentes de la pestaña Interbase en mi máquina Core2Duo, si ejecuto un for ... while del 1 al 450mil con un IBQuery con la sentencia "insert into almacen ..." para cada vale, se tarda 52segundos en hacerlo, alguien tendrá una idea para hacerlo mas eficiente?

Espero haber sido claro. Gracias de antemano y saludos.
Responder Con Cita
  #2  
Antiguo 25-10-2010
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Mejora rendimiento

Verifica si puedes deshabilitar indices, triggers, efectua commit cada 10.000 registros, mientras las insercion masiva
Responder Con Cita
  #3  
Antiguo 25-10-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
aun asi 45 segundos para casi medio millon de registros me parece bastante aceptable.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #4  
Antiguo 25-10-2010
acalderonr acalderonr is offline
Miembro
 
Registrado: may 2003
Ubicación: Mexico, DF
Posts: 33
Poder: 0
acalderonr Va por buen camino
En efecto, es bastante razonable el tiempo.

Gracias ASAPLTDA por tu respuesta. De hecho no tengo habilitado ningún Trigger ni Índice ni nada, solo es que a veces los usuarios son bastante desesperados. Pero me tocará hacerlos entrar en razón .

En efecto AzidRain, es bastante razonable 52 segundos. Lo voy a probar con un Procedure del lado del servidor y veré si mejora un poquito.

Gracias por contestar. Saludos.
Responder Con Cita
  #5  
Antiguo 25-10-2010
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
masivo

lo otro que puedes hacer es generar una carga de registro pero particionada el proceso 1 graba 99.9999 registros el proceso 2 graba 100.000 a 199.000 eso generaria una carga simultanea a a base de datos es posible que mejore . Otra solucion es us disco mas rapido ahora en el mercado hay unod discos superveloces pero +$$$$
Responder Con Cita
  #6  
Antiguo 25-10-2010
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
Cita:
Empezado por ASAPLTDA Ver Mensaje
lo otro que puedes hacer es generar una carga de registro pero particionada el proceso 1 graba 99.9999 registros el proceso 2 graba 100.000 a 199.000 eso generaria una carga simultanea a a base de datos es posible que mejore . Otra solucion es us disco mas rapido ahora en el mercado hay unod discos superveloces pero +$$$$
Como dice aca el compañero podrias dividir la carga en 10 partes iguales para poder mostrarles el progreso de la carga de datos asi la desesperacion es menor jaja te lo digo por experiencia.

Ahora para mejorar la velocidad pues verifica que tus indices sean numeros enteros (al menos la primaria) eso agilizara un poco la carga.
Responder Con Cita
  #7  
Antiguo 25-10-2010
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Prueba cual es la diferencia de velocidad entre estas dos opciones:
- generando el SQL directamente
- generando un SQL con parámetros y luego ir rellenando los parámetros.

Código Delphi [-]
with IBQuery do
begin
   {Abrir transaccion y demas requerimientos}
   while hay_registros_para procesar do
   begin
      SQL.Text := 'insert into almacen (campo1, campo2, ...) values ('+param1+','+param2+','...+')';
      ExecQuery;
   end
   Commit;
end

Código Delphi [-]
with IBQuery do
begin
   {Abrir transaccion y demas requerimientos}
   SQL.Text := 'insert into almacen (campo1, campo2, ...) values (?param1,?param2,...)';
   while hay_registros_para procesar do
   begin
      Params.ByName['Param1'].AsString := parametro1;
      Params.ByName['Param2'].AsString := parametro2;
      ExecQuery;
   end
   Commit;
end
Responder Con Cita
  #8  
Antiguo 25-10-2010
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
Hazlo por procedimiento almacenado, mejora notablemente ya que solo viajan los datos y no la instrucción por el cable, ademas, el servidor siempre ejecuta mas rápido un procedimiento almacenado.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #9  
Antiguo 25-10-2010
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Ampliacion Concepto

[quote=Kipow;380335]Como dice aca el compañero podrias dividir la carga en 10 partes iguales para poder mostrarles el progreso de la carga de datos asi la desesperacion es menor jaja te lo digo por experiencia.

la idea es generar multiples hilos de carga de datos si requieren intervencion del operador, o si es como entiendo usas un procedimiento almacenedo para recibir la cabecera de los volantes y en la base de datos generas los detalles
Responder Con Cita
  #10  
Antiguo 25-10-2010
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
[quote=ASAPLTDA;380365]
Cita:
Empezado por Kipow Ver Mensaje
Como dice aca el compañero podrias dividir la carga en 10 partes iguales para poder mostrarles el progreso de la carga de datos asi la desesperacion es menor jaja te lo digo por experiencia.

la idea es generar multiples hilos de carga de datos si requieren intervencion del operador, o si es como entiendo usas un procedimiento almacenedo para recibir la cabecera de los volantes y en la base de datos generas los detalles
Con diferentes hilos podria mejorar bastante, no es para nada mala idea. yo decia lo de la division para poder mostrar el progreso, pero me parece mejor eleccion la de multiples hilos (igual dependera del servidor de BD)
Responder Con Cita
  #11  
Antiguo 25-10-2010
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
He hecho esta prueba y definitivamente conviene hacer un SQL con parámetros.
Lo que no fue concluyente es si es preferible hacer un insert o ejecutar un procedimiento para insertar.
Todo me daba el mismo tiempo.
Pruébalo en tu servodor a ver como va.
(Hecho en Delphi 6, pero con componentes standard, para que no tengas problemas)
Archivos Adjuntos
Tipo de Archivo: zip PruebaInsercionMasiva.zip (7,3 KB, 14 visitas)
Responder Con Cita
  #12  
Antiguo 27-10-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Otra solución simple pero que los usuarios entienden es poner justo antes de lanzar la consulta un msgbox: "Esta consulta tardará unos segundos...espere por favor...leyendo >500,000 registros" un poco bizarro pero increiblemente funciona
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #13  
Antiguo 27-10-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Off topic

Cita:
Empezado por AzidRain Ver Mensaje
[...] un poco bizarro pero increiblemente funciona
¿Solución valiente, generosa, lucida o espléndida?
Responder Con Cita
  #14  
Antiguo 28-10-2010
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Lo que no fue concluyente es si es preferible hacer un insert o ejecutar un procedimiento para insertar.
Todo me daba el mismo tiempo.
Sin lugar a dudas el procedimiento almacenado es mas rapido y eficiente. No dudes en usarlo..
Tambien te conviene actualizar a la ultima version de Firebird, hay cierta mejoria en la rapidez en algunas circunstancias..
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #15  
Antiguo 29-10-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Mi estimado Al, yo solo diría "Solución que le sirve para el usuario final" y punto. Como siempre he defendido al usuario el vale leches que si el sql, que si la consulta, que si no está optimizada, etc. Quieren cosas que ellos entiendan en su propio lenguaje y con eso están conformes. ¿Que si un proceso tarde 1 minuto? se paran por un café y san seacabó, lo que les molesta es la incertidumbre de no saber que pasa con el programa.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #16  
Antiguo 29-10-2010
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Es *absolutamente* necesario que el usuario espere????


Porque de lo contrario, yo diria que es mejor poner el proceso en un thread en el background y notificar cuando haya terminado (tipo notificacion de messenger).

Muchas veces la desesperacion es mas porque el programa esta colgado, a que el proceso en si se demore...

--------

No olvides mirar las recomendaciones que da la documentacion de la BD:

http://www.firebirdfaq.org/faq209/

O quizas:

http://www.firebirdfaq.org/faq336/

---------
He usado http://www.da-soft.com/anydac/ y en mi experiencia con este driver (de pago) es que tiene un excelente desempeño. Mucho mejor que lo que viene de "fabrica" en Delphi
__________________
El malabarista.
Responder Con Cita
  #17  
Antiguo 29-10-2010
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Red face Aclaración del off topic

Cita:
Empezado por AzidRain Ver Mensaje
Mi estimado Al, yo solo diría "Solución que le sirve para el usuario final" y punto. Como siempre he defendido al usuario [...]
Perdón, creo que se entendió mal mi off topic. Me parece adecuado el consejo que diste y voy de acuerdo con tu punto de vista sobre los usuarios y demás.

Es que me llamó la atención lo de bizarro, cuyo significado puse a manera de juego. Te ofrezco una disculpa por el mal entendido.
Responder Con Cita
  #18  
Antiguo 29-10-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
No te preocupes mi estimado Al, aqui no pasa nada nadie se molesta. Jajaja. Por otro lado estaremos de acuerdo que no es absolutamente necesario hacer esperar al usuario, casi a todos nos ha pasado que dejamos para una segunda y hasta tercerea iteración optimizaciones como está y mientras tanto ponemos algún mensajito o código provisional mientras terminanos la iteración en que estamos.

Un abrazo hasta Morelia
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #19  
Antiguo 10-11-2010
martinartaza martinartaza is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 77
Poder: 14
martinartaza Va por buen camino
En mi experiencia el problema no es que demore, sino ...

Como digo, en mi experiencia el problema no es que demore, sino que se cuelga, me paso de tener este tipo de problema y la mejor solución de todas fue mostrar un panel con un gif y un cartel que diga espere por favor.
Responder Con Cita
  #20  
Antiguo 10-11-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up

Cita:
Empezado por acalderonr Ver Mensaje
...
Estoy usando Delphi 6, Firebird 2.1 con los componentes de la pestaña Interbase en mi máquina Core2Duo, si ejecuto un for ... while del 1 al 450mil con un IBQuery con la sentencia "insert into almacen ..." para cada vale, se tarda 52segundos en hacerlo, alguien tendrá una idea para hacerlo mas eficiente?
...
Pues yo te recomiendo que leas estas dos partes 1 y 2 de un articulo que te va guiar para esos menesteres. Te recomiendo leerlo sin flojear.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Insertar en un dataset?? izia Varios 5 22-02-2010 11:04:09
Nuevo golpe de MS AzidRain La Taberna 6 05-04-2009 00:06:18
insertar armando Servers 1 06-08-2007 20:01:59
Insertar sonidos egm1802 API de Windows 1 23-04-2004 18:05:39
Insertar con Ado comba Conexión con bases de datos 1 17-02-2004 10:40:51


La franja horaria es GMT +2. Ahora son las 01:56:19.


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
Copyright 1996-2007 Club Delphi