¿Por qué demora tanto esta consulta?

118 views
Skip to first unread message

Alejandro Garcia G.

unread,
Aug 11, 2017, 1:35:36 PM8/11/17
to Comunidad de Visual Foxpro en Español
Saludos. Tengo un problema, una consulta a una base de datos MySQL conectado de manera remota me esta demorando demasiado por si sola y en comparación a otra base de datos conectado de manera igual y con mayor cantidad de registros y no se porqué sucede esto. ¿Me puede alguien indicar que hay de malo para que demore en respndoer?.

MySQL 5.7, utilizo Navicat para ejecutarla (ya que desde mi app en VFP demora demasiado).

La consulta es:
SELECT a.codcue, a.debcom, a.crecom
FROM cn_contable a
LEFT JOIN cn_puc b ON b.codcue = a.codcue AND b.nivel = 5
WHERE a.feccom <= '2017-12-12'   
AND a.cn_mostrarlocal = 1

Agradezco comentarios.

Patricio Muñoz

unread,
Aug 11, 2017, 1:46:49 PM8/11/17
to publice...@googlegroups.com
Puede ser por falta de indices en los campos relacionales y/o condicionales

Bendiciones
--
Saludos

Patricio Muñoz
Pro&Tech
Analista en Sistemas

Alejandro Garcia G.

unread,
Aug 11, 2017, 2:01:27 PM8/11/17
to Comunidad de Visual Foxpro en Español
Ambas tablas tiene indice, y en ambas hay un indice común, codcue.

Si embargo, deja y verifico bien esos indices para ver si por ese lado puede ser.

Gracias.

ZeRoberto

unread,
Aug 11, 2017, 2:03:58 PM8/11/17
to publicesvfoxpro
Crea un indice por fecha

Saludos

Víctor Hugo Espínola Domínguez

unread,
Aug 11, 2017, 2:21:53 PM8/11/17
to publice...@googlegroups.com
Prueba mudando AND b.nivel = 5 al Where y dentro del Where en primeros lugares las condiciónes que menos filas cumplan.

Saludos,
Víctor.
Lambaré - Paraguay.

Andrés Oscar Gimbatti

unread,
Aug 11, 2017, 2:30:22 PM8/11/17
to Comunidad de Visual Foxpro en Español
un indice por feccom te la va a acelerar bastante


Alejandro Garcia G.

unread,
Aug 11, 2017, 2:33:14 PM8/11/17
to Comunidad de Visual Foxpro en Español
Bueno gracias todos, segui las sugerencias, revise los indices, inclui uno por fecha sola, y he movido filtros según lo comentado, quedando así:


SELECT a.codcue, a.debcom, a.crecom
FROM cn_contable a
LEFT JOIN cn_puc b ON b.codcue = a.codcue
WHERE b.nivel = 5
AND a.cn_mostrarlocal = 1
AND a.feccom <= '2017-12-12'   

Y de mas o menos 162 y algo mas de segundos, paso a 67,320s según Navicat. Considero que es una buena mejora. Voy continuar probando y luego lo hago desde VFP para ver resultados.

De todas formas si tienen otra sugerencia bienvenida sea.

Alejandro Garcia G.

unread,
Aug 11, 2017, 2:34:37 PM8/11/17
to Comunidad de Visual Foxpro en Español
Ese lo tenia combinado con codcue, ya hice uno solo con feccom, y como comente en el anterior, mejoro bastante, sigo probrando.

Gracias.

Oscar Quiros Coto

unread,
Aug 11, 2017, 3:56:00 PM8/11/17
to Comunidad de Visual Foxpro en Español
Para este caso, que con el left join no te funciona, ya que estas utilizando el alias b con el where
Prueba asi:
SELECT a.codcue, a.debcom, a.crecom 
FROM cn_contable a,puc b 
WHERE b.nivel = 5 
and b.codcue = a.codcue 

AND a.cn_mostrarlocal = 1
AND a.feccom <= '2017-12-12'    
Esto te funciona mejor, puesto que ningún campo del alias b lo estas mostrando, recuerda que el left join te indica que no importa si no existe en b, igual se muestra todo lo que esta en a. En otras palabras con el left join sin mostrar datos de b, es mejor hacer el select sobre la tabla cn_contable sin utilizar puc.


Por otro lado, dependiendo de la cantidad de registros, memoria del servidor etc, puedes mejorar las consultas modificando algunas opciones de configuracion de tu mysql.

mpulla

unread,
Aug 12, 2017, 10:16:40 AM8/12/17
to Comunidad de Visual Foxpro en Español
Hola Alejandro.

No conosco MySql, pero posiblemente este casteando tu campo a.feccon a caracter, prueba casteando el string '2017-12-12' a fecha.


SELECT a.codcue, a.debcom, a.crecom
FROM cn_contable a
LEFT JOIN cn_puc b ON b.codcue = a.codcue AND b.nivel = 5
WHERE a.feccom <= STR_TO_DATE('2017-12-12',   '%Y%m%d%')  
AND a.cn_mostrarlocal = 1


Saludos.
Mauricio

almonts ( www.ontarioxb.es )

unread,
Aug 12, 2017, 2:58:43 PM8/12/17
to Comunidad de Visual Foxpro en Español
Hola buenas tardes prueba lo siguiente.

Doy por hecho que en las dos tablas tienes definido el campo codcue como indexado, si es así y su nombre de indice es por ejemplo idxcodcue
Fuerza las dos tablas para que utilicen este indice de la siguiente manera

SELECT a.codcue, a.debcom, a.crecom 
FROM cn_contable a force index(idxcodcue)
LEFT JOIN cn_puc b force index(idxcodcue)  ON b.codcue = a.codcue AND b.nivel = 5 

WHERE a.feccom <= '2017-12-12'    
AND a.cn_mostrarlocal = 1

tambien puedes utilizar el indice primario en la tabla cn_contable de la siguiente manera.

SELECT a.codcue, a.debcom, a.crecom 
FROM cn_contable a force index(primary)
LEFT JOIN cn_puc b force index(idxcodcue)  ON b.codcue = a.codcue AND b.nivel = 5 

WHERE a.feccom <= '2017-12-12'    
AND a.cn_mostrarlocal = 1

Prueba los resultados,, lo tienes que notar seguro.
Ya nos cuentas, saludos :)
Reply all
Reply to author
Forward
0 new messages