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

[SOLUCIONADO] Hacer un procedimiento almacenado

Estas en el tema de Hacer un procedimiento almacenado en el foro de Mysql en Foros del Web. hola a todos, tengo el siguiente problema que espero me puedan ayudar: tengo 2 tablas. Tabla alimentador y tabla data en la tabla alimentador almaceno ...
  #1 (permalink)  
Antiguo 24/07/2013, 14:38
 
Fecha de Ingreso: junio-2008
Ubicación: Osorno
Mensajes: 155
Antigüedad: 15 años, 10 meses
Puntos: 3
Pregunta Hacer un procedimiento almacenado

hola a todos, tengo el siguiente problema que espero me puedan ayudar:
tengo 2 tablas.
Tabla alimentador y tabla data
en la tabla alimentador almaceno 2 campos el campo ID_ALIMENTADOR y el campo NOMBRE_ALIMENTADOR
en la tabla data almaceno el campo ID_ALIMENTADOR y todos los campos que contienen la data (registros) del alimentador.
para obtener la data de un alimentador con su respectivo nombre hago la siguiente consulta:
Código MySQL:
Ver original
  1. SELECT alimentador.ALI_NOMBRE,DAT_FECHA,DAT_P,DAT_Q,DAT_S,DAT_I0,DAT_I1,DAT_I2,DAT_I3,DAT_FP,DAT_V12,DAT_V23,DAT_V31 from data
  2. LEFT JOIN alimentador ON data.DAT_ALI_ID=alimentador.ALI_ID
  3. WHERE DAT_ALI_ID = '$id' AND DAT_FECHA BETWEEN '$fecha_inicio' and '$fecha_final'
esta consulta la ejecuto desde una pagina en PHP, el resultado que entrega es correcto el único problema es que demora unos 15 segundos en mostrar los datos, es por esto que quiero hacer esta consulta con un procedimiento almacenado para ver si con eso logro bajar los tiempos de respuesta, me gustaría que me orienten en como hacer este procedimiento ya que no tengo idea de como se hace eh buscado en Internet pero lo que sale no explican muy bien como hacerlo, es por ello que solicito la ayuda del foro.
espero me puedan ayudar!!!!
  #2 (permalink)  
Antiguo 24/07/2013, 14:53
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: Hacer un procedimiento almacenado

Antes que intentar un SP:
- ¿El campo DAT_FECHA está indexado?
- ¿Es de tipo DATE o DATETIME?
- La tabla "alimentador" es la base de la consulta, o lo es DATA? Es decir, ¿Es un reporte de los alimentadores o de los datos sin importar el alimentador?
__________________
¿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 24/07/2013, 15:18
 
Fecha de Ingreso: junio-2008
Ubicación: Osorno
Mensajes: 155
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: Hacer un procedimiento almacenado

gnzsoloyo, gracias por responder

- ¿El campo DAT_FECHA está indexado?
NO, este campo no lo tengo indexado

- ¿Es de tipo DATE o DATETIME?
DAT_FECHA es de tipo DATETIME

- La tabla "alimentador" es la base de la consulta, o lo es DATA? Es decir, ¿Es un reporte de los alimentadores o de los datos sin importar el alimentador?

la consulta es a la tabla DATA de esa tabla saco la mayoría de los datos, de la tabla alimentador solo rescato el nombre del alimentador.
  #4 (permalink)  
Antiguo 24/07/2013, 17:22
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: Hacer un procedimiento almacenado

Antes que nada, crea un índice sobre ese campo y prueba de nuevo.
__________________
¿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 25/07/2013, 07:15
 
Fecha de Ingreso: junio-2008
Ubicación: Osorno
Mensajes: 155
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: Hacer un procedimiento almacenado

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Antes que nada, crea un índice sobre ese campo y prueba de nuevo.
Hola gnzsoloyo, hice lo que me indicaste, indexe el campo DAT_FECHA, pero sigue demorando lo mismo al mostrar el resultado (15 segundos) aprox. También probé indexando el campo ID_Alimentador y el DAT_Fecha , pero lo mismo, no hay mejoras :(
  #6 (permalink)  
Antiguo 25/07/2013, 08:02
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: Hacer un procedimiento almacenado

Haz una consulta contra un par de datos que no sean sólo fecha, sino fecha y hora, tal que la hora de inicio sea "00:00:00", y la del final "23:59:59", así nos aseguramos que no esté descartando el índice.
Por otro lado, ¿la relación con el alimentador es opcional o mandatoria?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 25/07/2013, 09:59
 
Fecha de Ingreso: junio-2008
Ubicación: Osorno
Mensajes: 155
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: Hacer un procedimiento almacenado

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Haz una consulta contra un par de datos que no sean sólo fecha, sino fecha y hora, tal que la hora de inicio sea "00:00:00", y la del final "23:59:59", así nos aseguramos que no esté descartando el índice.
Por otro lado, ¿la relación con el alimentador es opcional o mandatoria?
hago la consulta como tu dices, agregando la fecha y la hora, pero nado sigue todo igual.

¿la relación con el alimentador es opcional o mandatoria?
a que te refieres con opcional o mandatoria, no entendí la pregunta :(
  #8 (permalink)  
Antiguo 25/07/2013, 10:07
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: Hacer un procedimiento almacenado

Mandatoria = Obligatoria.
Sucede cuando la relación debe existir sí o si.
Pregunto eso porque estás usando LEFT JOIN, lo que en realidad genera un barrido bastante completo de la tabla, y siendo que MySQL no optimiza el WHERE, eso puede dar malos resultados a veces. En cambio usando INNER JOIN, sobre campos relacionados como FK, la cosa cambia.

Veamos cómo está creando el plan de consulta:
Código MySQL:
Ver original
  1. EXPLAIN SELECT alimentador.ALI_NOMBRE,DAT_FECHA,DAT_P,DAT_Q,DAT_S,DAT_I0,DAT_I1,DAT_I2,DAT_I3,DAT_FP,DAT_V12,DAT_V23,DAT_V31 FROM data
  2. LEFT JOIN alimentador ON data.DAT_ALI_ID=alimentador.ALI_ID
  3. WHERE DAT_ALI_ID = '$id' AND DAT_FECHA BETWEEN '$fecha_inicio' AND '$fecha_final';
Eso te devolverá una tabla que describe cómo esá haciendo MySQL la consulta, y veremos si hay algo ineficiente en ella.

Copia el resultado y postealo acá.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 25/07/2013, 10:38
 
Fecha de Ingreso: junio-2008
Ubicación: Osorno
Mensajes: 155
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: Hacer un procedimiento almacenado

bueno, el traer el nombre del alimentador no era tan necesario asi que modifique mi consulta, ahora quedo de la siguiente manera:
Código MySQL:
Ver original
  1. SELECT DAT_FECHA,DAT_P,DAT_Q,DAT_S,DAT_I0,DAT_I1,DAT_I2,DAT_I3,DAT_FP,DAT_V12,DAT_V23,DAT_V31 FROM data
  2. WHERE DAT_ALI_ID = '$id' AND DAT_FECHA BETWEEN '$fecha_inicio' AND '$fecha_final';

pero sigue demorando lo mismo en mostrar los resultados.

al ejecutar el EXPLAIN me muestra lo siguiente

ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS |KEY|KEY_LEN| REF | ROWS | EXTRA
1 | SIMPLE | data | ALL | DAT_FECHA, DAT_ALI_ID|null|null |null |24795 |Using Where


otra cosa, algo que no había probado es que instale Navicat en el servidor y ejecute la consulta a través de este programa y la consulta ahí demora 0,172 Seg.
si la ejecuto a través del PhpMyAdmin tampoco funciona. :(
  #10 (permalink)  
Antiguo 25/07/2013, 10:54
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: Hacer un procedimiento almacenado

Cita:
pero sigue demorando lo mismo en mostrar los resultados.
La idea del EXPLAIN era ver por donde falla la cosa, no que tardara mas o menos.

Cita:
ID | SELECT_TYPE | TABLE | TYPE | POSSIBLE_KEYS |KEY|KEY_LEN| REF | ROWS | EXTRA
1 | SIMPLE | data | ALL | DAT_FECHA, DAT_ALI_ID|null|null |null |24795 |Using Where
De esto se puede saber algunas cosas:
1) Está leyendo primero la tabla DATA, pero la está leyendo completa... lo cual es un espanto.
2) Se podría mejorar un poco la consulta si se crea un índice sobre (DAT_FECHA, DAT_ALI) al mismo tiempo (ambas en un mismo INDEX).
3) Sólo hay 24.795 registros... lo que me indica que el problema no es la consulta, por más ineficiente que sea.

Entonces veo que me dices:
Cita:
ejecute la consulta a través de este programa y la consulta ahí demora 0,172 Seg.
Pues, según yo lo veo, el problema no está en la base, en la tabla o en la consulta. Tu servidor del host tiene un cogote muy, pero muy fino, porque se está ahogando con muy poco.
En otras palabras, es un problema de red o de servidor, y no de base de datos. Puede estar configurado con un buffer de consultas muy reducido, o haber demasiada concurrencia de usuarios, si es compartido. En cualquier caso, no es la consulta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 25/07/2013, 13:27
 
Fecha de Ingreso: junio-2008
Ubicación: Osorno
Mensajes: 155
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: Hacer un procedimiento almacenado

como dices tu a lo mejor es el servidor, pero si hago la consulta en procedimiento almacenado como era mi idea al comienzo, se podrá mejorar un poco el tiempo de respuesta, me podrías ayudar a crear un procedimiento con esa consulta por favor, para hacer la prueba.
  #12 (permalink)  
Antiguo 25/07/2013, 13:43
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: Hacer un procedimiento almacenado

Me temo que te equivocas.
Si el problema es el cuello de botella en la conexión, no afectará al retraso de 15 segundos, porque eso pertenece a la conexión entre el script y MySQL.
Sería diferente si estuvieses leyendo solamente las tablas, y recibiendo y enviando cada paso, registro a registro, pero no es así.
El SP se ejecutará en el servidor y enviará a tu aplicación el set de datos completo, exactamente de la misma forma que lo hace ahora esa consulta única. No habrá diferencia entre ambas cosas.

Si lo quieres intentar, te recomiendo usar la librería de objetos (MYSQLI) o semejante de PHP (infiero que trabajas en ese lenguaje), porque la otra es obsoleta y no tiene capacidad para manejar set de resultados de un SP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 25/07/2013, 15:39
 
Fecha de Ingreso: junio-2008
Ubicación: Osorno
Mensajes: 155
Antigüedad: 15 años, 10 meses
Puntos: 3
Respuesta: Hacer un procedimiento almacenado

entiendo, bueno muchas gracias por tu ayuda!!!

Etiquetas: almacenado, campo, join, php, procedimiento, registros, select, tabla
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 05:58.