Ver Mensaje Individual
  #6 (permalink)  
Antiguo 28/07/2009, 08:17
Avatar de gnzsoloyo
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: Error: Consulta Mysql-VB.net 2008

La sentencia que estás usando puede ser un problema, porque exige al motor de MySQL una búsqueda demasiado compleja, y por allí puede estar el problema. Es muy posible que haya un exceso de recursos usados y esto se perciba cuando se ejecuta a nivel local, ya que es tu propia PC la que se está usando para responder a la consulta.
Esta misma consulta, realizada contra un server de bases de datos (un buen fierro), no debería pestañear, pero, como dije, si los recursos de la PC no son buenos, puede haber problemas.
Supongo que en este foro debe haber una restricción parecida respecto a la de MySQL, pero aún así veamos:
Código SQL:
Ver original
  1. SELECT  
  2.     Campo5,
  3.     COUNT(Campo5) AS 'Total'
  4. FROM MyDBs.tblExample
  5. WHERE
  6.     Campo6 >= '" & _fecha1 & "' AND
  7.     Campo6 <= '" & _fecha2 & "' AND
  8.     Campo9 IN (" & _text & ") AND
  9.     Campo5 LIKE '%" & _val & "%'
  10. GROUP BY Campo5
Hay demasiadas condiciones en el WHERE (podría haber más), y al menos dos de ellas se pueden sintetizar con una sola cláusula.
Cuando pones demasiadas cosas en el WHERE debes recordar queel MySQL no puede optimizar lo que se ponga allí, lo que sí puede cuando va en el SELECT o el FROM.
Por otro lado, el uso de LIKE exige al MySQL la realización de una rutina mucho más compelja que simplemente un "=". El mejor modo de enfrentarlo sería realizar un prefiltrado de tabla usando subconsultas:
Código SQL:
Ver original
  1. SELECT  
  2.     Campo5
  3. FROM MyDBs.tblExample
  4. WHERE
  5.     Campo9 IN (" & _text & ")  AND
  6.     (Campo6 BETWEEN '" & _fecha1 & "' AND '" & _fecha2 & "');
Esto permitirá hacer un filtrado general sobre valores que deben estar sí o si. El MySQL construye una tabla en memoria con los registros que cumplen esta condición. Si luego ponemos:
Código SQL:
Ver original
  1. SELECT
  2.     Campo5,
  3.     COUNT(Campo5) AS 'Total'
  4. FROM
  5.     SELECT  
  6.         Campo5
  7.     FROM MyDBs.tblExample
  8.     WHERE
  9.     Campo9 IN (" & _text & ")  AND
  10.     (Campo6 BETWEEN '" & _fecha1 & "' AND '" & _fecha2 & "') ) Tabla1
  11. WHERE
  12.     Campo5 LIKE '%" & _val & "%'
  13. GROUP BY Campo5
Con esto, el LIKE se usará solamente sobre la tabla ya condensada con las otras condiciones, que son las que más registros van a eliminar, por lo que la tabla en memoria quedaría muy reducida.

Intentalo y veamos.

P.D.: Si se da algun error de sintaxis, será porque esto lo escribí un poco apurado.

Un tip final sería recomendarte que elimines el MySQL 6.0 y pongas el 5.1.4, ya que el 6.0 fue un proyecto alfa (las alfa son las que contienen todos los errores imaginables), y la release final de ese proyecto fue la 5.1.3, según entiendo, donde los bugs del 6.0 están corregidos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)