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

Optimizar esta consulta

Estas en el tema de Optimizar esta consulta en el foro de Mysql en Foros del Web. Antes que nada gracias por estar ahi!. Siempre encuentro las respuestas que necesito en este foro. Ahora.. Como puedo hacer para optimizar esta consulta? Necesito ...
  #1 (permalink)  
Antiguo 10/02/2012, 13:30
 
Fecha de Ingreso: julio-2009
Mensajes: 29
Antigüedad: 14 años, 8 meses
Puntos: 0
Pregunta Optimizar esta consulta

Antes que nada gracias por estar ahi!.
Siempre encuentro las respuestas que necesito en este foro.

Ahora..
Como puedo hacer para optimizar esta consulta?
Necesito hacer unos joins a otras tablas pero me da el error:

[Err] 1116 - Too many tables; MySQL can only use 61 tables in a join

Aca, la consulta:

SELECT
DATE_FORMAT(a.deadline,'%Y-%m') as YM
,ROUND( SUM(DISTINCT b.volume * c.rate * d.cotiz ) , 2 ) + IF (i.volume is not null, ROUND( (i.volume * j.rate_dtp * k.cotiz), 2 ),0) AS total_pesos


, IF( rt.id_rate_tr IS NOT NULL, ROUND( SUM(DISTINCT ft.volume * rt.rate_tr * mtr.cotiz ) , 2 ) ,0)
+ IF( re.id_rate_ed IS NOT NULL, ROUND( SUM(DISTINCT pe.volume * re.rate_ed
+ IF( RLOC.id_rate_loc IS NOT NULL, ROUND( SUM(DISTINCT PLOC.volume * RLOC.rate_loc * MLOC.cotiz ) , 2 ), 0)
+ IF( REP.id_rate_edp IS NOT NULL, ROUND( SUM(DISTINCT PEP.volume * REP.rate_edp * MEP.cotiz ) , 2 ), 0)
+ IF( rp.id_rate_proof IS NOT NULL, ROUND( SUM(DISTINCT pp.volume * rp.rate_proof * mproof.cotiz ) , 2 ), 0)
+ IF( rd.id_rate_dtpier IS NOT NULL, ROUND( SUM(DISTINCT pd.volume * rd.rate_dtpier * md.cotiz ) , 2 ), 0)
+ IF( rpd.id_rate_pdtpier IS NOT NULL, ROUND( SUM(DISTINCT ppd.volume * rpd.rate_pdtpier * mpd.cotiz ) , 2 ), 0) as total_pagado

FROM projects a
INNER JOIN fact_volumes_rates b ON a.id_project = b.id_project
INNER JOIN rates c ON b.id_rate = c.id_rate
INNER JOIN monedas d ON c.id_moneda = d.id_moneda

INNER JOIN rates_types_rates rtr ON rtr.id_type_rate = c.id_type_rate
INNER JOIN projects_status pst ON pst.id_status = a.id_status
LEFT JOIN projects_source_target st ON st.id_source_target = a.id_source_target

LEFT JOIN clients cl ON a.id_client=cl.id_client

LEFT JOIN users upm ON upm.id_user=a.id_pm
LEFT JOIN teams_users tupm on tupm.id_user=upm.id_user
LEFT JOIN teams tpm ON tpm.id_team=tupm.id_team

LEFT JOIN projects_dtps i ON a.id_project = i.id_project
LEFT JOIN rates_dtps j
USING ( id_rate_dtp )
LEFT JOIN monedas k ON j.id_moneda = k.id_moneda
LEFT JOIN projects_fech_ent l ON l.id_project = a.id_project

LEFT JOIN files fl on fl.id_project=a.id_project
LEFT JOIN files_trans ft ON ft.id_file=fl.id_file
LEFT JOIN rates_trans rt ON rt.id_rate_tr=ft.id_rate_tr
LEFT JOIN monedas mtr ON mtr.id_moneda=rt.id_moneda

LEFT JOIN rates_types_rates rtrtr ON rtrtr.id_type_rate=rt.id_type_rate

LEFT JOIN users utr ON utr.id_user=ft.id_trans
LEFT JOIN teams_users tutr on tutr.id_user=utr.id_user
LEFT JOIN teams ttr ON ttr.id_team=tutr.id_team

LEFT JOIN projects_editors pe ON pe.id_project=a.id_project
LEFT JOIN rates_eds re ON re.id_rate_ed=pe.id_rate_ed
LEFT JOIN monedas med ON med.id_moneda=re.id_moneda

LEFT JOIN rates_types_rates rtred ON rtred.id_type_rate=re.id_type_rate

LEFT JOIN users ued ON ued.id_user=pe.id_editor
LEFT JOIN teams_users tued on tued.id_user=ued.id_user
LEFT JOIN teams ted ON ted.id_team=tued.id_team

LEFT JOIN projects_locs PLOC ON PLOC.id_project = a.id_project
LEFT JOIN rates_locs RLOC ON RLOC.id_rate_loc = PLOC.id_rate_loc
LEFT JOIN monedas MLOC ON MLOC.id_moneda = RLOC.id_moneda

LEFT JOIN rates_types_rates RTRLOC ON RTRLOC.id_type_rate = RLOC.id_type_rate

LEFT JOIN users ULOC ON ULOC.id_user = PLOC.id_loc
LEFT JOIN teams_users TULOC on TULOC.id_user = ULOC.id_user
LEFT JOIN teams TLOC ON TLOC.id_team = TULOC.id_team

LEFT JOIN projects_editproofs PEP ON PEP.id_project = a.id_project
LEFT JOIN rates_editproofs REP ON REP.id_rate_edp = PEP.id_rate_edp
LEFT JOIN monedas MEP ON MEP.id_moneda = REP.id_moneda

LEFT JOIN rates_types_rates RTREP ON RTREP.id_type_rate = REP.id_type_rate

LEFT JOIN users UEDP ON UEDP.id_user = PEP.id_editproofer
LEFT JOIN teams_users TUEP on TUEP.id_user = UEDP.id_user
LEFT JOIN teams TEP ON TEP.id_team = TUEP.id_team

LEFT JOIN projects_proof pp ON pp.id_project=a.id_project
LEFT JOIN rates_proof rp ON rp.id_rate_proof=pp.id_rate_proof
LEFT JOIN monedas mproof ON mproof.id_moneda=rp.id_moneda

LEFT JOIN rates_types_rates rtrproof ON rtrproof.id_type_rate=rp.id_type_rate

LEFT JOIN users uproof ON uproof.id_user=pp.id_proof
LEFT JOIN teams_users tuproof on tuproof.id_user=uproof.id_user
LEFT JOIN teams tproof ON tproof.id_team=tuproof.id_team

LEFT JOIN projects_dtpiers pd ON pd.id_project=a.id_project
LEFT JOIN rates_dtpiers rd ON rd.id_rate_dtpier=pd.id_rate_dtpier
LEFT JOIN monedas md ON md.id_moneda=rd.id_moneda

LEFT JOIN rates_types_rates rtrd ON rtrd.id_type_rate=rd.id_type_rate

LEFT JOIN users ud ON ud.id_user=pd.id_dtpier
LEFT JOIN teams_users tud on tud.id_user=ud.id_user
LEFT JOIN teams td ON td.id_team=tud.id_team

LEFT JOIN projects_pdtpiers ppd ON ppd.id_project=a.id_project
LEFT JOIN rates_pdtpiers rpd ON rpd.id_rate_pdtpier=ppd.id_rate_pdtpier
LEFT JOIN monedas mpd ON mpd.id_moneda=rpd.id_moneda

LEFT JOIN rates_types_rates rtrpd ON rtrpd.id_type_rate=rpd.id_type_rate

LEFT JOIN users upd ON upd.id_user=ppd.id_pdtpier
LEFT JOIN teams_users tupd on tupd.id_user=upd.id_user
LEFT JOIN teams tpd ON tpd.id_team=tupd.id_team

WHERE DATE_FORMAT(a.deadline, '%Y-%m') IN ( '2011-11', '2011-12' )
AND cl.id_client_type = '1'

GROUP BY YM
ORDER BY YM
  #2 (permalink)  
Antiguo 10/02/2012, 14:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Optimizar esta consulta

Hola ezekkiel:

El problema es que estás repitiendo una cantidad enorme de veces una misma tabla, por ejemplo la tabla monedas la estás poniendo 9 veces!!! esto es una barbaridad

Código:
LEFT JOIN monedas d 
LEFT JOIN monedas k 
LEFT JOIN monedas md 
LEFT JOIN monedas med 
LEFT JOIN monedas MEP 
LEFT JOIN monedas MLOC 
LEFT JOIN monedas mpd 
LEFT JOIN monedas mproof 
LEFT JOIN monedas mtr
No hay necesidad de declararlas (a reserva de que nos explicaras qué es lo que quieres hacer o según tú por qué se tienen que duplicar)... la cláusula ON puede contener TANTAS UNIONES COMO NECESITES, separándolas con OR y/o AND, según sea el caso... veo que en todos los casos sólo estás haciendo uniones sencillas (y puedo suponer que por eso pones tantas veces una misma tabla) pero en lugar de eso puedes hacer algo como esto:

Código:
FROM tabla1
LEFT JOIN tabla2 ON tabla1. campo = tabla2.campo
LEFT JOIN tabla3 
ON tabla1.campo = Tabla3.campo AND Tabla2.otro_campo = Tabla3.otro_campo
..........
Analiza correctamente qué es lo que necesitas obtener, estoy seguro de que podrás simplificar muchísimo la consulta.

Saludos
  #3 (permalink)  
Antiguo 10/02/2012, 14:24
 
Fecha de Ingreso: julio-2009
Mensajes: 29
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Optimizar esta consulta

Gracias por la respuesta!
El problema es que cada una de las veces que incluyo una tabla con un alias distinto es porque necesita ser asi (Creo)..

LEFT JOIN monedas MEP (el tipo de moneda de EP)
LEFT JOIN monedas MLOC (el tipo de moneda de LOC)
......

Espero ser claro, ya estoy mareado con la consulta probando con UNION, etc..

Slds.

Etiquetas: join, tables
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 08:47.