Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Cursores

Estas en el tema de Cursores en el foro de Mysql en Foros del Web. BUenas amigos....les comento tengo un Procedimiento Almacenado en el cual tengo tres cursores, el tema esta ke se pone muy lenta la consulta demora 5 ...
  #1 (permalink)  
Antiguo 22/06/2011, 10:03
 
Fecha de Ingreso: marzo-2009
Mensajes: 291
Antigüedad: 15 años, 1 mes
Puntos: 1
Pregunta Cursores

BUenas amigos....les comento tengo un Procedimiento Almacenado en el cual tengo tres cursores, el tema esta ke se pone muy lenta la consulta demora 5 segundos en insertar un registro y son 50.000 o sea entre 60 horas me demora es muchisimo....es normal ke demore tanto el motor mysql???? tenia entendido ke era muy rapido??? hay alguna solucion???? les dejo mi codigo

EGIN
DECLARE done INT DEFAULT 0;
declare cuot varchar(10);
declare ultimo varchar(10);
declare pagador varchar(10);
declare comp varchar(10);
declare cat varchar(10);
declare fecuo date;
declare nro int;
declare pagC double;
declare mont double;
declare resul double;
declare band bool;
declare curM cursor for select idpagador,compania,categoria, numero from movimientos group by idpagador,compania,categoria, numero;
declare curmax cursor for select max(fcuota) from movimientos where idpagador=pagador and compania=comp and categoria=cat and numero=nro and tipo='R' limit 1;
declare curP cursor for SELECT cuota,monto FROM movimientos where idpagador=pagador and compania=comp and categoria=cat and numero=nro and fcuota=fecuo and tipo='R' limit 1;


DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

open curM;

Repeat
FETCH curM INTO pagador,comp,cat,nro;
IF NOT done THEN
open curmax;
Fetch curmax into fecuo;

open curP;
Fetch curP into cuot,mont;
insert into tpagos(hora)values(CURRENT_TIMESTAMP);
close curP;

close curmax;

end if;
UNTIL done END REPEAT;

close curM;
espero ke puedan ayudarme muchas gracias!!!!!
  #2 (permalink)  
Antiguo 22/06/2011, 10:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cursores

Uno de los problemas que le veo al asunto es que estás haciendo lecturas casi recursivas que no parecen estar ´bien planteadas.
- Primero buscas todos los registros distintos con estos datos: idpagador, compania, categoria, numero
Código MySQL:
Ver original
  1.     idpagador,
  2.     compania,
  3.     categoria,
  4.     numero
  5.     movimientos
  6.     idpagador,compania, categoria, numero;
Luego, con los mismos datos y en la misma tabla, buscas el mayor valor de fcuota y donde tipo sea "R". En ese contexto, LIMIT es irrelevante porque MAX() sin agrupamientos siempre devuelve un único registro:
Código MySQL:
Ver original
  1.     MAX(fcuota)
  2.     movimientos
  3.     idpagador=pagador AND
  4.     compania=comp AND
  5.     categoria=cat AND
  6.     numero=nro AND
  7.     tipo='R';
Después, y con los mismos datos y en la misma tabla, buscas la cuota y el monto que corresponden a lo mismo.
Código MySQL:
Ver original
  1.     cuota,
  2.     monto
  3.     movimientos
  4.     idpagador=pagador AND
  5.     compania=comp AND
  6.     categoria=cat AND
  7.     numero=nro AND
  8.     fcuota=fecuo AND
  9.     tipo='R'

tengo la impresión de que todo ese conjunto de cosas se podría reducir a:
Código MySQL:
Ver original
  1.     cuota, monto, MAX(fcuota) fcuota, idpagador, compania, categoria, numero
  2.     movimientos
  3.     tipo='R'
  4. GROUP BY idpagador, compania, categoria, numero;
Lo más raro de todo, es que en definitiva no haces nada con todo eso porque lo que guardas al final es otra cosa:
Código MySQL:
Ver original 

¿Estás omitiendo algo o es realmente eso lo que quieres hacer? Porque si haces algo con estos datos puede que necesites un sólo cursor o incluso ninguna, y se pueda hacer un volcado masivo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 22/06/2011, 17:29
 
Fecha de Ingreso: marzo-2009
Mensajes: 291
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Cursores

je perdon si todos los datos van en el insert, lo ke paso es ke probe con el CURRENT_TIMESTAMP para ver cuanto se demoraba la consulta....je...gracias por tu respuesta probare la consulta ke me dijiste....pero si lo dejara como yo lo tengo es logico ke se demore mucho???? o en mi configuracion del mysql podria hacer algo?????
  #4 (permalink)  
Antiguo 22/06/2011, 21:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Cursores

Si lo dejas tal y como planteas estás haciendo lecturas redundantes, por lo que lo raro sería que no tardasen mucho.
Por otro lado, un cursor es un puntero a una lectura secuencial, y todo proceso secuencial requiere más tiempo que una consulta directa. A esto debes sumarle que en realidad estás abriendo tres veces la misma tabla y la estás recorriendo de tres formas diferentes para hacer algo que probablemente funcione bien con una sola y sin cursores... Eso es muy ineficiente. Es lógico que haya perdidas de tiempo.
Trata de ahcer las cos
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/06/2011, 06:36
 
Fecha de Ingreso: marzo-2009
Mensajes: 291
Antigüedad: 15 años, 1 mes
Puntos: 1
Respuesta: Cursores

ok muchas gracias por tus respuestas me kedo mas tranquilo si es una falla mia y no del motor de base de datos ke es lento je....muchas gracias

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:07.