FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
Mejora rendimiento
Verifica si puedes deshabilitar indices, triggers, efectua commit cada 10.000 registros, mientras las insercion masiva
|
#3
|
||||
|
||||
aun asi 45 segundos para casi medio millon de registros me parece bastante aceptable.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#4
|
|||
|
|||
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. |
#5
|
|||
|
|||
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 +$$$$
|
#6
|
||||
|
||||
Cita:
Ahora para mejorar la velocidad pues verifica que tus indices sean numeros enteros (al menos la primaria) eso agilizara un poco la carga. |
#7
|
||||
|
||||
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.
|
#8
|
||||
|
||||
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. |
#9
|
||||
|
||||
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) |
#10
|
||||
|
||||
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|| |
#11
|
||||
|
||||
Off topic
¿Solución valiente, generosa, lucida o espléndida?
|
#12
|
|||
|
|||
Cita:
Tambien te conviene actualizar a la ultima version de Firebird, hay cierta mejoria en la rapidez en algunas circunstancias.. |
#13
|
||||
|
||||
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|| |
#14
|
||||
|
||||
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. |
#15
|
||||
|
||||
Aclaración del off topic
Cita:
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. |
#16
|
||||
|
||||
Cita:
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#17
|
|||
|
|||
Cita:
|
|
|
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 |
|