MySQL - Query con SubQuery o subconsulta nunca termina.

 
Vista:
sin imagen de perfil

Query con SubQuery o subconsulta nunca termina.

Publicado por DALSOM (23 intervenciones) el 10/11/2012 14:33:40
Hola a todos, tengo este query con un subquery que nunca termina, y cuando lo hace, es porque dice que fue interrumpido. Que estoy haciendo, si en MSSql funciona instantaneamente ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use inventarios;
 
/* -- Indices creados antes de ejecutar el query 
 create index idx_ubicacion on inventario(ubicacion);
 create index idx_ubanterior on inventario(ub_anterior);
 create index idx_ubTipo on inventario(ubicacion,tipo);
 create index idx_ubanteriortipo on inventario(ub_anterior,tipoanterior);
*/
 
select inv.inv_Desc
			from inventario ser
 			where inv.tipo = 1 and inv.ubicacion in
         (select i.ubicacion from inventario i
                where i.tipo = 1  and i.estatus <> 'B'
                group by i.ubicacion
                having COUNT(*) > 1
        )
			order by inv.inv_desc;


Gracias de antemano,
Saludos,
Dalsom,
Rep. Dominicana.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Query con SubQuery o subconsulta nunca termina.

Publicado por xve (1151 intervenciones) el 10/11/2012 20:59:14
Hola Dalsom, es desaconsejable utilizar la clausula IN con muchos registros, ya que para MySQL son OR y esto hace inviables las consultas... para unos pocos OR's no hay problema, pero si son muchos se ara eterno, pero tanto en SQL Server como en MySQL o cualquier otro motor de base de datos... los OR's son siempre muy lentos si hay muchos.

Te recomiendo hacer un JOIN... algo así:

1
2
3
4
5
6
SELECT * FROM
(select ubicacion from inventario i where i.tipo=1) t1
LEFT JOIN
(select ubicacion from inventario i where i.tipo=1 AND i.estatus<>'B'  having COUNT(*)>1) t2
ON t1.ubicacion=t2.ubicacion
group by ti.ubicacion


Por ejemplo, los que sean t2.ubicacion == false, es que no hay coincidencia... Esta consulta tendría que hacer mas o menos lo mismo, pero mucho mas rápido.

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Query con SubQuery o subconsulta nunca termina.

Publicado por DALSOM (23 intervenciones) el 11/11/2012 02:22:55
Hola, muy agradecido por su respuesta.

Pues le comento, que con la idea que me dio, funciono y termino.
Aunque creo que aun esta por debajo del tiempo de ejecucion que esperaba.

Le cuento, que me funciono mejor con los inner joins que poniendo cualquier left outer join.
Tambien, el tiempo de ejecucion:

- para un total de 1284 registros como resultado de la busqueda y en una base de datos con menos registros (Aproximadamente unos 6 meses sin actualizar) contra una actualizada hace una semana que me ofrece un total de 3216 resultados...

* MySql sin la clausula order by : tiempo de 33.587 segundos, para 1284 resultados.
* MySql con la clausula order by : tiempo de 491.933 segundos, para 1284 resultados.
* MsSql 2008 express, con la clausula order by : 1 segundo, para 3216 resultados.

- No creo que sea por recursos de la pc, ya que estoy utilizando la misma pc para la busqueda, y tengo instalado tanto el MySql, como el MsSql.
- Las tablas tienen los mismos indices, es decir, las mismas columnas estan indexadas en un manejador como en el otro.
- La maquina es un i7 de segunda generacion con 4gb de memoria y windows 7, y un disco ssd.
- La busqueda tiene ya mas de 4 meses en produccion en MsSql 2008 express, y windows Xp, sin ningun inconveniente por cuantos registros esten como resultado del subquery al que se compara con la clausula IN.
- Estos resultados fueron probados solo con inner joins en ambos manejadores, ya que con la clausula In se origino este post.

Alguna idea de porque tanta la diferencia?

- Que me faltaria probrar, los resultados en el servidor Linux de produccion, con lo que tendria que esperar mucho para poder verlo en el ambiente de produccion, y aun creo que estan muy poco depurados estos resultados obtenidos. Y este servidor, a mi parecer, un Xeon quad core, debe tener mejor desempeno que mi portatil de desarrollo.

PD : No estoy publicando estos datos, para hacer un debate entre usuarios de estas herramientas, o un Vs entre herramientas para saber cual sea mejor o cual guste mas. Simplemente expongo los hechos, para buscar una mejor solucion.

De antemano, le agradesco su ayuda, y a todo aquel que leyo el post.

Saludos,
Dalsom,
Rep. Dominicana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Query con SubQuery o subconsulta nunca termina.

Publicado por Dalsom (23 intervenciones) el 20/11/2012 16:07:26
Hola a todos, he logrado mejorar los tiempos de respuesta de MySql,
lo que faltaba eran mas indices, aunque tube que recrear toda la base de datos, y crear los indices con las tablas vacias y luego llenarlas.

- Agregue indices en las descripciones de todas las tablas,
- Agregue indices en los campos alternos mas usados como el numero de cliente en las facturas,
- Agregue indices a las fechas.

El cambio es impresionante, aunque no se como respondera a la escritura y transacciones. Espero sea igual de bueno que la busqueda.

Por el momento, con la base de datos actualizada, ha dado muy buenos resultados, mejores que los de hace un tiempo atras.

Gracias a "Xve" por su ayuda.
Gracias por leer mi post a todos.

Saludos desde Rep. Dominicana,
Dalsom.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar