2012-09-24 5 views
0

다음 쿼리는 예상대로 작동합니다. 그러나 데이터가 선택된 요약 테이블이 너무 큽니다. 쿼리에 많은 시간이 소요됩니다.조인 대신 임시 테이블

SELECT s.date_time AS date_time,SUM(s.requests) AS sum_requests,SUM(s.impressions) AS sum_views,SUM(s.clicks) AS sum_clicks,SUM(s.conversions) AS sum_conversions, 
SUM(s.total_revenue) AS sum_revenue,SUM(s.total_revenue) AS sum_spend, 
SUM(s.total_basket_value) AS sum_bv,SUM(s.total_num_items) AS sum_num_items,SUM(s.total_pubrevenue) AS sum_pubrevenue 
FROM ox_data_summary_ad_hourly AS s 
INNER JOIN ox_banners AS d ON (d.bannerid=s.ad_id) 
INNER JOIN ox_campaigns AS m ON (m.campaignid=d.campaignid) 
INNER JOIN ox_clients AS a ON (a.clientid=m.clientid) 
LEFT JOIN ox_zones AS z ON (z.zoneid=s.zone_id) 
LEFT JOIN ox_affiliates AS p ON (p.affiliateid=z.affiliateid) 
WHERE a.agencyid = 3 AND z.zone_type = 'application' AND z.delivery = 8 
AND s.date_time>='2012-07-01 00:00:00' AND s.date_time<='2012-07-01 23:59:59' 
GROUP BY date_time 

조인을 단순화해야합니다. 모든 조인에 대한 임시 테이블을 만든 다음 해당 테이블을 기본 테이블에 조인하는 방법이 있습니까? 이것은 내가 지금까지 시도한 것입니다.

drop table if exists test.helper; 
create table test.helper 
select d.network_type , d.is_network, d.bannerid, p.agencyid, z.zone_type, z.delivery , z.zoneid 
FROM ox_banners as d 
INNER JOIN ox_campaigns AS m ON (m.campaignid=d.campaignid) 
INNER JOIN ox_clients AS a ON (a.clientid=m.clientid) 
left JOIN ox_agency as oa ON (oa.account_id = a.clientid) 
left JOIN ox_affiliates AS p ON (p.agencyid = oa.agencyid) 
left JOIN ox_zones AS z ON (z.affiliateid = p.affiliateid); 

alter table test.helper add key(bannerid, zoneid); 

그러나 원본 테이블과 조인 할 때 올바른 결과를 반환하지 않습니다.

SELECT s.ad_id, s.date_time AS date_time,SUM(s.requests) AS sum_requests,SUM(s.impressions) AS sum_views,SUM(s.clicks) AS sum_clicks,SUM(s.conversions) AS sum_conversions, 
SUM(s.total_revenue) AS sum_revenue,SUM(s.total_revenue) AS sum_spend, 
SUM(s.total_basket_value) AS sum_bv,SUM(s.total_num_items) AS sum_num_items,SUM(s.total_pubrevenue) AS sum_pubrevenue 
FROM ox_data_summary_ad_hourly AS s 
inner JOIN test.helper AS d ON (d.bannerid=s.ad_id) 
where d.agencyid = 3 AND d.zone_type = 'application' AND d.delivery = 8 and s.date_time>='2012-07-01 00:00:00' AND s.date_time<='2012-07-01 23:59:59' 
GROUP BY date_time 

답변

1

첫째, 나는 INNER JOINSLEFT JOIN의 대체 것입니다. ox_zones에 WHERE 절이 있기 때문에 LEFT JOIN에 의해 생성 된 Null 값은 어쨌든 삭제됩니다. 외부 조인은 분명 비싸기 때문에 가능하면 피해야합니다.

합리적이고 현대적인 RDBMS에서 임시 테이블을 생성하여 쿼리 플래너를 추측하는 것은 종종 비생산적입니다. 모든 조인 조건의 색인이 생성됩니까? WHERE 절에서 참조되는 열의 색인이 생성 되었습니까?

+0

mysql에서 데이터를 이동하고 하나의 조인만을 지원하는 다른 DB로 옮길 계획입니다. 그러므로 질문. – shantanuo

+0

하나의 참여? 와우. 어떤 "데이터베이스"입니까? – paulbailey