это мой код Oracle
SELECT CZAS_W CZAS , SYSTEM_W SYSTEM, 'ALL', sum(NVL(STAN, 0)) STAN FROM (
select '2018-02-06 '||A.CZAS CZAS_W, A.SYSTEM SYSTEM_W, A.PRACOWNIK PRACOWNIK_W, A.STATUS, L.PRACOWNIK, L.CZAS, L.SYSTEM, L.STAN
from GC_ALWAYS A , O2MT_GC2_LICENCJI_LOG L
WHERE A.SYSTEM = L.SYSTEM (+)
AND A.PRACOWNIK = L.PRACOWNIK (+)
AND TO_DATE('2018-02-06 '||A.CZAS, 'RRRR-MM-DD HH24:MI') = L.CZAS (+)
AND A.SYSTEM = 'HURT06OTO' )
group by CZAS_W , SYSTEM_W
В Oracle он работает в 226 мс. (Не используется индекс)
Я переписал его в MySQL:
SELECT s1.CZAS_W CZAS , s1.SYSTEM_W SYSTEM, 'ALL', sum(ifnull(s1.STAN, 0)) STAN FROM (
select STR_TO_DATE(concat("2018-02-06 ",A.CZAS), '%Y-%m-%d %H:%i') CZAS_W, A.SYSTEM SYSTEM_W, A.PRACOWNIK PRACOWNIK_W, A.STATUS, L.PRACOWNIK, L.CZAS, L.SYSTEM, L.STAN
from GC_ALWAYS A
LEFT OUTER JOIN O2MT_GC2_LICENCJI_LOG L ON A.SYSTEM = L.SYSTEM
and A.PRACOWNIK = L.PRACOWNIK
and STR_TO_DATE(concat("2018-02-06 ",A.CZAS), '%Y-%m-%d %H:%i') = L.CZAS
WHERE A.SYSTEM = 'HURT06OTO'
) s1 group by s1.CZAS_W , s1.SYSTEM_W
Но время работы составляет более 1000 секунд!
БД находятся на другом сервере. Но я думаю, что что-то не так в моей MySQL-версии кода.
В oracle я использую (+) синтаксис для внешнего соединения. Я что-то испортил в соединениях mysql?
И да, две таблицы соединены тремя столбцами по левому внешнему соединению.
Индексы имеют решающее значение, но с одной стороны, часть, на которую нужно сосредоточиться, такова:
AND STR_TO_DATE(CONCAT("2018-02-06 ",a.czas), '%y-%m-%d %h:%i') = l.czas
Если вы можете переписать это без функций, производительность будет значительно повышаться.
(+)
. Также, пожалуйста, смотрите минимальный воспроизводимый пример .