2016-02-26 156 views
0

我該怎麼做才能優化這個請求?處理時間很長。優化SQL查詢

SELECT DISTINCT CONCAT(p.sku,'_IM') as REF, CONCAT(p.ref_fabriq,'/FR ',COALESCE(frtemp.dispo,0),' - EU ',COALESCE(eutemp.dispo,0),'/CDE : FR ',COALESCE(frtemp.command,0),' - EU ',COALESCE(eutemp.command,0),'/ETA : FR ',COALESCE(frtemp.eta,''),' - EU ',COALESCE(eutemp.eta,''),'/ DATE FP : ',p.fin_promo,'/',p.class_prod,'/',p.crc) AS DESCRIPTION 
FROM price as p 
LEFT JOIN totfrhrl_temp frtemp ON p.sku = frtemp.sku 
LEFT JOIN totrihrl_temp eutemp ON p.sku = eutemp.sku 

WHERE p.sku IN (SELECT ALL fr.sku FROM totfrhrl as fr LEFT JOIN totfrhrl_temp frtemp ON fr.sku = frtemp.sku LEFT JOIN totrihrl_temp eutemp ON fr.sku = eutemp.sku WHERE fr.dispo != frtemp.dispo OR fr.command != frtemp.command OR fr.eta != frtemp.eta UNION SELECT ALL eu.sku FROM totrihrl as eu LEFT JOIN totrihrl_temp eutemp ON eu.sku = eutemp.sku LEFT JOIN totfrhrl_temp frtemp ON eu.sku = frtemp.sku WHERE eu.dispo != eutemp.dispo OR eu.command != eutemp.command OR eu.eta != eutemp.eta) 
+0

多久是「很長」,到底是什麼?像這樣幫助鄉親詳細弄清優化排序會爲你的工作需要。 – Castaglia

+0

爲例:8032總計,查詢花費70.1244秒 – FAPM

回答

0

我不知道這是否有效,但它應該是另一種獲得結果的方式。因爲我不知道該指數或有關你的表的任何其他信息我要做的就是改變你的左加入,使工會UNION ALL,同時添加一些代碼做切割重複的部分。

SELECT ALL fr.sku, fr.dispo, eutemp.dispo 
    FROM totfrhrl as fr 
LEFT JOIN totrihrl_temp eutemp ON fr.sku = eutemp.sku 
WHERE exists(select 1 from totfrhrl_temp frtemp 
     where frtemp.sku = fr.sku 
     and (fr.dispo != frtemp.dispo OR fr.command != frtemp.command OR fr.eta != frtemp.eta)) 

Union ALL 

SELECT ALL eu.sku, eu.dispo, frtemp.dispo 
    FROM totrihrl as eu 
LEFT JOIN totfrhrl_temp frtemp ON eu.sku = frtemp.sku 
WHERE exists(select 1 from totrihrl_temp eutemp 
     where eutemp.sku = eu.sku 
     and (eu.dispo != eutemp.dispo OR eu.command != eutemp.command OR eu.eta != eutemp.eta)) 
and not exists (select 1 from totfrhrl as fr where fr.sku=eu.sku) 

它會工作,如果SKU是你的表中的鍵

+0

嗨:) SKU是一個關鍵 – FAPM

+0

這個查詢沒有作品,空的結果 – FAPM

+0

@FAPM我試圖解決一些問題可能花費空的結果,請重試。 –

-1

我:) 測試它,它是很好的:

SELECT ALL p.sku, CONCAT(p.sku,frtemp.dispo,frtemp.command,frtemp.eta,eutemp.dispo,eutemp.command,eutemp.eta) as new, CONCAT(p.sku,fr.dispo,fr.command,fr.eta,eu.dispo,eu.command,eu.eta) 

FROM price as p 

LEFT JOIN totfrhrl_temp frtemp ON p.sku = frtemp.sku 
LEFT JOIN totrihrl_temp eutemp ON p.sku = eutemp.sku 
LEFT JOIN totfrhrl fr ON p.sku = fr.sku 
LEFT JOIN totrihrl eu ON p.sku = eu.sku 

WHERE CONCAT(p.sku,frtemp.dispo,frtemp.command,frtemp.eta,eutemp.dispo,eutemp.command,eutemp.eta) != CONCAT(p.sku,fr.dispo,fr.command,fr.eta,eu.dispo,eu.command,eu.eta) 

是否有改善這種機會? :)

+0

205秒5300行:/ – FAPM

+0

創建索引? – FAPM