Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Optimizar Consulta - algoritmo (https://www.clubdelphi.com/foros/showthread.php?t=47430)

jmartinez 28-08-2007 10:56:22

Optimizar Consulta - algoritmo
 
Muy Buenas,

Me llamo Jose y soy de León. Este es mi primer mensaje porque hasta el momento todas mis dudas las pude solucionar buceando por el foro, así que hola a todos!. Espero que haya acertado con el subforo correcto para postear.

Mi duda: Utilizo Delphi(6) + Zeos + Mysql. En estos momentos la BD en localhost. Me gustaría optimizar un proceso que considero que tarda demasiado. (1 min aproximadamente). A ver si logro explicarme de forma sencilla. Tengo el siguiente esquema:

1.- Ejecuto Consulta de Selección (devuelve 3.000 registros)
2.-Mientras no alcance el final del recorset, hacer
2.1.- Pequeños calculos con algunos campos del registro.
2.2.- Creación de Nueva Consulta de Insercción (Insert Into..... EXECSQL)
2.3.- Paso al siguiente registro.


Básicamente lo que hago es recorrer una tabla de clientes con datos, hacer cálculos dentro del bucle y con cada uno de ellos, para generar un recibo bancario, que creo dentro de dicho bucle. Como la consulta de seleccion inicial me trae más de 3.000 registros, tengo 3.000 iteraciones del bucle, y en cada una de ellas se hace un Insert Into, y un md.zqQuery.ExecSQL para insertarlo. Este proceso es el que me tarda alrededor de un minuto. (sin grabar los recibos en BD, el proceso completo tarda 1.6 segundos).

Tendría alguna forma de mejorar ésto?. Se me ocurría al menos meter una barra de progreso, pero ese "progreso" no comienza hasta que el proceso completo del bucle termina, es como si ignorara la instruccion de avance de la barra de progreso. Supongo que será algo del procesador y que habría q meter threads (algo que tengo bastante olvidado).

También he pensado grabar los datos a un archivo de texto, y posteriormente hacer un único Insert Into con todos los "Values", pero tampoco lo veo claro.


A ver me he explicado bien y alguien puede guiarme un poco.

Gracias por adelantado.

basti 28-08-2007 12:34:26

Hola, y bienvenido por tu primer post.

Para que te muestre el progreso, añade una línea Application.ProcessMessages; dentro del bucle donde realizas las operaciones. Esto hará que se actualize tu barra de progreso.

Paoti 28-08-2007 17:06:37

hola, no cemntan si los calculos los ahces por cada registro,


si es así porque no haces una consulta donde vayas creando campos calculados en base al registro.

ejemplo:


tabla articulos: id, descripcion, cantidad, precio


y haces una vista llamada, vArticulos


Código SQL [-]
select id, descripcion, cantidad, precio, (cantidad * precio) as total from Varticulos


y al final haces un insert masivo


Código SQL [-]
insert into OtraTabla Select * from Varticulos


espero te sirva


La franja horaria es GMT +2. Ahora son las 13:06:21.

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