2016-02-26 6 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 to 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) 

он будет работы, если ы является ключом к вашему столу

+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

Смежные вопросы