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

condicionales en un query

Estas en el tema de condicionales en un query en el foro de Mysql en Foros del Web. saludos, tengo este query pero creo q es poco eficiente.. ya que me sale "java heap space" select ReMovil, ReMotivo, RePuntoControl, RePlaca,ReLocalizacion,MtNombre,ReDateTime,ReLatit ud,ReLongitud from reportes ...
  #1 (permalink)  
Antiguo 12/06/2012, 14:43
 
Fecha de Ingreso: abril-2010
Mensajes: 12
Antigüedad: 14 años
Puntos: 0
Busqueda condicionales en un query

saludos, tengo este query pero creo q es poco eficiente.. ya que me sale "java heap space"

select ReMovil, ReMotivo, RePuntoControl, RePlaca,ReLocalizacion,MtNombre,ReDateTime,ReLatit ud,ReLongitud from reportes left join motivos on ReMotivo=MtId where ReMovil like '%' and RePuntoControl like '%' and (ReMotivo = '101' or ReMotivo = '103' or ReMotivo = '257' or ReMotivo = '256' or ReMotivo = '10') or (ReDistancia >= '0' and ReDistancia < '1.5') order by ReDateTime desc

saben como podria optimizarlo?


Gracias por su atencion.
  #2 (permalink)  
Antiguo 12/06/2012, 14:55
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: condicionales en un query

En tu contexto esto es irrelevante:
Código MySQL:
Ver original
  1. ReMovil like '%'
  2.     and RePuntoControl like '%'
Lo que sucede es que no saca ni pone nada, pero manda a ejecutar una comparación que no realiza nada... Ese LIKE hace que MySQL devuelva todos los registros, sin iltrar ninguna condición.
¿Se entiende?
Por otro lado, comparar uno a uno varios valores con el mismo campo, no es eficiente a menos que sea con AND. Es mejor, en el OR, usar IN(listadevalores)
Tabién ten en cuenta que poner como cadenas de texto valores que se comparan con campos numéricos puede llevar a hacer que MySQL pierda tiempo haciendo conversiones implícitas inencesarias.
Los valores numéricos van siempre sin apostrofes.

Mas o menos andaría por acá:
Código MySQL:
Ver original
  1.     ReMovil,
  2.     ReMotivo,
  3.     RePuntoControl,
  4.     RePlaca,
  5.     ReLocalizacion,
  6.     MtNombre,
  7.     ReDateTime,
  8.     ReLatitud,
  9.     ReLongitud
  10.     reportes LEFT JOIN motivos ON ReMotivo = MtId
  11.     AND ReMotivo IN(101, 103, 257, 256, 10)
  12.     OR (ReDistancia >= 0 and ReDistancia < 1.5)
  13. ORDER BY ReDateTime desc
__________________
¿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 12/06/2012, 15:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: condicionales en un query

Cita:
Editado: Como otras veces se me adelantó el compañero gnzsoloyo con la respuesta jejeje, saludos
Hola cariberecord:

El error "java heap space" puede ser ocasionado por varios motivos, no necesarimanete por una consulta ineficiente, aunque si hay varios detalles que podrías ajustar en tu consulta:

1. Las condiciones LIKE son muy tardadas y además, al hacer esto

Código:
ReMovil like '%' and RePuntoControl like '%'
en realidad no estás filtrando nada, podrías eliminar estas dos condiciones y obtener el mismo resultado:

2. Puedes cambiar las condiciones OR por una sola condición IN:

Código:
ReMotivo in ('101', '103', '257', '256', '10')
NOTA, si tus campos SON NUMÉRICOS entonces no hay necesidad de ponerlos entre comillas, ya que de esta manera se tiene que realizar una conversión implícita:

Código:
ReMotivo in (101, 103, 257, 256, 10)
3. Mucho ojo cuando utilices los operadores >= y <= CON CADENAS, ya que pueden tener un comportamiento distinto a los numéricos (al utilizar cadenas lo hace de manera alfabética, no por el valor nominal).

(ReDistancia >= 0 and ReDistancia < 1.5)

4. Si no tienes creados índices, CREALOS. si tienes creados INDICES revisa que sean todos los necesarios para la consulta.

5. Ejecuta la consulta directamente desde la consola de MySQL y no desde tu programa o página y ejecútala con la opción EXPLAIN

http://dev.mysql.com/doc/refman/5.0/es/explain.html

De esta manera podrás darte cuenta si tienes algún otro punto por mejorar.

6. Revisa que efectivamente necesites un LEFT JOIN o si puedes utilizar un INNER JOIN, recordando cómo se comportan cada uno de ellos.

Saludos
Leo.
  #4 (permalink)  
Antiguo 12/06/2012, 15:25
 
Fecha de Ingreso: abril-2010
Mensajes: 12
Antigüedad: 14 años
Puntos: 0
Respuesta: condicionales en un query

Muchisimas gracias por tan pronta respuesta me ayudo a comprender mejor los condicionales.. pero sigo con el inconveniente.. :P

El query me corre muy bien en workbench pero lo quiero usar en Birt es por esto que debo usar

ReMovil LIKE '%' AND RePuntoControl LIKE '%'

En Birt los paso como

ReMovil LIKE ? AND RePuntoControl LIKE ?

Entonces cuando lo estoy integrando en Birt me sale ese error "java heap space"

Mi principal temor era ineficiencia del query, pero ahora creo que la unica seria aumentar el tamaño de memoria de java. tu que opinas?

Gracias Totales.
  #5 (permalink)  
Antiguo 12/06/2012, 20:45
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: condicionales en un query

A como lo veo, aunque puedas solucionar el problema desde Java, siempre subsistirá el defecto de performance de esas dos comparaciones. Si no estás enviando parámetros a comparar, no tendrían directamente que estar.
Esto suele ser sencillo en programación, porque lo que se hace es agregar o sacar dinámicamente partes de la consulta, de acuerdo a los parámetros que el usuario está ingresando.
No es necesario que la consulta tenga una construcción fija.
Por supuesto que no sé cómo lo estás haciendo tu, y java no es mi dominio, pero estimo que deberías considerar la posibilidad de creación dinámica de las consultas y sus parámetros, para darle mayor flexibilidad y eficiencia al uso de la base.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: condicionales, join, query, select
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 00:52.