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

Sub consulta muy lenta, pasar a join????

Estas en el tema de Sub consulta muy lenta, pasar a join???? en el foro de Mysql en Foros del Web. Hola a todos de nuevo, tengo una consulta de mysql la cual funciona bien el problema es cuando trato de hacer la consulta en toda ...
  #1 (permalink)  
Antiguo 29/08/2012, 10:03
 
Fecha de Ingreso: agosto-2012
Mensajes: 7
Antigüedad: 11 años, 8 meses
Puntos: 0
Sonrisa Sub consulta muy lenta, pasar a join????

Hola a todos de nuevo, tengo una consulta de mysql la cual funciona bien el problema es cuando trato de hacer la consulta en toda la tabla, ésta tabla con la que trabajo es muyyyyyyy grande y he leído que las subconsultas tienen pésimo rendimiento con tablas tan grandes, no se si cambiar la consulta con un join, si es así lo intenté pero me marca un error tras otro, ¿alguien tiene una mejor idea?

el query es el siguiente:

Código:
SELECT 
   plan.numero_prestamo, 
   plan.numero_cuota, 
   plan.numero_cuota+1 AS proxima_cuota,
   plan.periodo,
   plan.codigo_tipo_saldo,
FROM 
   pr_saldos_plan_pago_mes plan
WHERE 
   plan.numero_prestamo = 1 AND
   plan.numero_cuota IN
      ( SELECT 
            MAX( numero_cuota ) AS ultima_cuota 
        FROM 
            pr_saldos_plan_pago_mes 
        WHERE 
            numero_prestamo = 1 )
Este query me arroja bien los resultados, solo que pueden notar que hay un filtro "where" con el cual me arroja solo los numero de prestamo = 1, la idea es que me arroje todos los demás, pero al quitarle los where la consulta se vuelve eterna, lleva ejecutándose 20 hrs y aún no tengo respuesta, cabe destacar que hay mínimo 50mil créditos diferentes, es decir, es una gran tabla, no me importa esperar mucho tiempo en el query, pero mas de 20hrs??? imposible, necesito reducirlo a máximo poco mas de una hora....los resultados con el where incluido son:

Código:
numero_prestamo	numero_cuota	proxima_cuota	periodo	codigo_tipo_saldo
1		153		154		12		55
1		153		154		12		6
1		153		154		12		2
1		153		154		12		53
1		153		154		12		1
ahora se debe hacer eso, pero sin filtrar solo en numero de préstamo "1"


Alguien tiene una idea de como optimizar éste proceso???? muchas gracias de antemano!

PD: otra idea que tuve era hacer la consulta sin subconsulta, mas simplificado como:

SELECT *
FROM
pr_saldos_plan_pagos
WHERE
numero_prestamo = 1
ORDER BY
numero_cuota DESC
LIMIT
5


El resultado da el mismo, el gran problema es que el "limit 5" tendría que ser variable siempre, ya que cada numero de prestamo varía la cantidad de numero de cuota, en este caso es 5, pero puede ser 1, puede ser 3, puede ser 9, etc, etc. eso destruye la lógica
  #2 (permalink)  
Antiguo 29/08/2012, 11:29
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, 5 meses
Puntos: 2658
Respuesta: Sub consulta muy lenta, pasar a join????

Y probaste:
Código MySQL:
Ver original
  1.    numero_prestamo,
  2.    numero_cuota,
  3.    (numero_cuota+1) proxima_cuota,
  4.    periodo,
  5.    codigo_tipo_saldo,
  6.    pr_saldos_plan_pago_mes
  7.    numero_prestamo = 1
  8. HAVING numero_cuota = MAX( numero_cuota );
__________________
¿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 29/08/2012, 11:37
 
Fecha de Ingreso: agosto-2012
Mensajes: 7
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Sub consulta muy lenta, pasar a join????

gracias por tu pronta respuesta :), pero desafortunadamente esa consulta me arroja empty set :(

Código:
mysql> SELECT
    ->    numero_prestamo,
    ->    numero_cuota,
    ->    (numero_cuota+1) proxima_cuota,
    ->    periodo,
    ->    codigo_tipo_saldo
    -> FROM
    ->    pr_saldos_plan_pago_mes
    -> WHERE
    ->    numero_prestamo = 1
    -> HAVING numero_cuota = MAX( numero_cuota );
Empty set (2.11 sec)
  #4 (permalink)  
Antiguo 29/08/2012, 12:15
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, 5 meses
Puntos: 2658
Respuesta: Sub consulta muy lenta, pasar a join????

Mmmm...
Eso debe ser porque le MAX(numero_cuota) no tiene numero_prestamo = 1;
En ese contexto, yo habría:
Código MySQL:
Ver original
  1.    numero_prestamo,
  2.    numero_cuota,
  3.    (numero_cuota+1) proxima_cuota,
  4.    periodo,
  5.    codigo_tipo_saldo,
  6.    SELECT *  FROM pr_saldos_plan_pago_mes WHERE numero_prestamo = 1) T1
  7. HAVING numero_cuota = MAX( numero_cuota );
__________________
¿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 29/08/2012, 12:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Sub consulta muy lenta, pasar a join????

Hola fzeromusic:

Desde el post pasado que pusiste te comenté que en realidad no nos haz explicado qué es lo que quieres hacer...

http://www.forosdelweb.com/f86/probl...-join-1009605/

Pero no te tomaste el tiempo de explicar a detalle qué es lo que pretendes obtener... en tu post decías que con esta consulta tenías prácticamente resuelto tu problema, por eso ya no hice ningún comentario...

en realidad veo varios problemas aquí... En primera el uso de una sentencia IN y una subconsulta... de entrada la función IN es muy tardada, y en tu caso no tendría razón de ser, pues a final de cuenta la subconsulta REGRESA SOLO UN REGISTRO, por lo tanto podrías cambiarla por una condición (=), sin problemas.

Podrías intentar hacer esto (no estoy seguro que funcione y que obtenga realmente lo que quieres):

Código MySQL:
Ver original
  1.    plan.numero_prestamo,
  2.    plan.numero_cuota,
  3.    plan.numero_cuota+1 AS proxima_cuota,
  4.    plan.periodo,
  5.    plan.codigo_tipo_saldo
  6.    pr_saldos_plan_pago_mes plan
  7.   (SELECT numero_prestamo, MAX(numero_cuota) ultima_cuota
  8.    FROM pr_saldos_plan_pago_mes
  9.    GROUP BY numero_prestamo) T
  10. ON plan.numero_prestamo = T.numero_prestamo
  11. AND plan.numero_cuota = t.ultima_cuota

Podrías agregar la condición

Código:
WHERE 
   numero_prestamo = 1
para que te regrese sólo los valores de ese préstamo. Finalmente, checa que tengas creados los índices suficientes en tu tabla para hacer más rápida la consulta.

Saludos
Leo.
  #6 (permalink)  
Antiguo 30/08/2012, 08:39
 
Fecha de Ingreso: agosto-2012
Mensajes: 7
Antigüedad: 11 años, 8 meses
Puntos: 0
Respuesta: Sub consulta muy lenta, pasar a join????

Hola, gracias por la respuesta ejecuté la última consulta y el resultado es el mismo, tarda una eternidad en ejecutarse, incluso con el filtro "where numero_prestamo =1"... a diferencia de la otra que con datos filtrados si me arrojaba resultados, a mi parecer está bien indexada la base y por otro lado los índices no creo poder cambiar, ya que así me llega la base de datos del cliente, éste es el análisis de los índices:

Código:
+-------------------------+------------+---------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table                   | Non_unique | Key_name                        | Seq_in_index | Column_name       | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------------------------+------------+---------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            1 | periodo           | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            2 | numero_prestamo   | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            3 | numero_cuota      | A         |        NULL |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          0 | PRIMARY                         |            4 | codigo_tipo_saldo | A         |    73741748 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes                        |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | numero_prestamo                 |            1 | numero_prestamo   | A         |      508563 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | codigo_tipo_saldo               |            1 | codigo_tipo_saldo | A         |         346 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | periodo                         |            1 | periodo           | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo               |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo               |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_tipo_saldo    |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_tipo_saldo    |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_tipo_saldo    |            3 | codigo_tipo_saldo | A         |    14748349 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota         |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota         |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota         |            3 | numero_cuota      | A         |    36870874 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            1 | anio_mes          | A         |         193 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            2 | numero_prestamo   | A         |     5672442 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            3 | numero_cuota      | A         |    36870874 |     NULL | NULL   |      | BTREE      |         |               |
| pr_saldos_plan_pago_mes |          1 | anio_mes_prestamo_cuota_tipo_sa |            4 | codigo_tipo_saldo | A         |    73741748 |     NULL | NULL   |      | BTREE      |         |               |
+-------------------------+------------+---------------------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
20 rows in set (0.02 sec)
Lo que busco específicamente es filtrar los números de préstamo que se encuentran en su última cuota, por eso la cuota la utilizo como max, por ejemplo el préstamo # 1000 tiene 60 números de cuota 1-60, solo tengo que sacar la línea que se encuentre en el 60, aveces no solo es 1, quizás puedan ser 5 depósitos en su última cuota, es por eso que la consulta del préstamo 1 arroja 5 resultados, el préstamo 2, arroja 1 solo resultado, etc..... mi consulta trabaja bien filtrada, pero al buscar tooodos los números de préstamo se vuelve en una consulta eterna, ese es básicamente el problema, gracias por sus respuestas amigos, saludos

Etiquetas: join, lento, query, subconsulta
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 17:58.