Ver Mensaje Individual
  #4 (permalink)  
Antiguo 02/10/2012, 13:09
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: 17 años
Puntos: 2658
Respuesta: Consultas Lentas

La primera corrección que te haría es recordarte que esa no es exactamente la sintaxis de un INNER JOIN, y además que debes tener en cuenta que las relaciones declaradas entre tablas es conveniente ponerlas en el FROM y no en el WHERE.
Por otro lado, no has usado alias, lo que complica un poco la lectura.
Pero el problema mayor, que te está causando duplicación de registros y además mucha lentitud es que estás haciendo un JOIN en estrella (una tabla central a N tablas), y eso es lo que genera ese producto cartesiano.
Para solventarlo estás haciendo un DISTINCT, pero eso es insuficiente porque de todos modos puede estar dando un resultado algo inconsistente.
El primer acercamiento sería:
Código MySQL:
Ver original
  1.     B.id_beneficiario Id,
  2.     B.fecha_alta Alta,
  3.     B.nombre Nombre,
  4.     B.apepaterno PrimerApellido,
  5.     B.apematerno SegundoApellido,
  6.     B.edad Edad,
  7.     B.telefono Telefono,
  8.     B.celular Celular,
  9.     G1.nombre_grupos Grupo,
  10.     G.nombre Vertiente,
  11.     C.nombre_colonia Colonia,
  12.     GBN.nombre Mesa,
  13.     OU.nombre Actividad,
  14.     CA.estadoCatB
  15.  Estado
  16.     beneficiario B
  17.     INNER JOIN grupos_beneficiarios GB ON B.id_beneficiario = GB.id_beneficiario
  18.     INNER JOIN grupos1 G1 ON GB.id_grupos = G1.id_grupo
  19.     INNER JOIN grupos G  ON B.vertiente = G.id_grupo
  20.     INNER JOIN catstatusb CA  ON B.autorizado = CA.estadoCatB
  21.     INNER JOIN municipio M ON B.id_municipio = M.id
  22.     INNER JOIN localidad L ON (M.id = L.id_municipio
  23.  AND B.id_localidad = L.id_localidad)
  24.       INNER JOIN colonia C ON B.id_colonia = C.id
  25.     INNER JOIN grupos_beneficiarios_nivel GBN ON GB.id_nivel_grupo = GBN.id
  26.     INNER JOIN ocupacion_principal OP ON B.id_ocupacion = OP.id
  27.     INNER JOIN ocupacion_subgrupo OS ON B.id_ocupacionsub = OS.id
  28.     INNER JOIN ocupacion_unitario OU ON B.id_ocupacion_uni = OU.id
  29. WHERE B.fecha_alta BETWEEN '2012-01-02' AND '2012-10-01'
  30. ORDER BY G1.id_grupos
Como sugerencia, hay que definir un indice por beneficiarios.fecha_alta, como mínimo, para darle mejor performance. Pero eso será insuficiente si no pules las relaciones de modo que no se genere esa consulta en estrella, como te digo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)