2012-09-24 29 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 JOINS更換LEFT JOIN秒。既然你在ox_zones上有一個WHERE子句,那麼由LEFT JOIN創建的空值將會退出。外連接顯然很貴,應儘可能避免。

在合理的現代RDBMS上,通過創建臨時表來對查詢規劃器進行二次猜測常常會適得其反。你所有的連接條件都被索引了嗎?您的WHERE子句中引用的列是否已編入索引?

+0

我打算將數據從mysql中移出,並轉移到僅支持1個連接的其他數據庫。因此,這個問題。 – shantanuo

+0

一個加入?哇。哪個「數據庫」是? – paulbailey