【发布时间】:2018-02-12 22:34:18
【问题描述】:
这是我的 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 中的连接?
是的,两个表由 3 列全部通过左外连接连接。
【问题讨论】:
-
如果您不使用索引,那么您就不能期望获得不错的性能。重新性能一般google官方MySQL文档重新优化&重新索引。还有谷歌搜索能力。 RDMBS 实施完全是关于优化。 PS Oracle 本身已弃用其
(+)表示法。另请参阅minimal reproducible example。 -
解释计划向您展示了什么?从那里开始帮助调试性能问题。