【问题标题】:Rewrite Oracle SQL to MYsql将 Oracle SQL 重写为 MYsql
【发布时间】: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
  • 解释计划向您展示了什么?从那里开始帮助调试性能问题。

标签: mysql oracle


【解决方案1】:

索引是至关重要的,但把它放在一边,要关注的部分是:

AND STR_TO_DATE(CONCAT("2018-02-06 ",a.czas), '%y-%m-%d %h:%i') = l.czas

如果你可以在没有函数的情况下重写它,性能将大大提高。

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2019-09-11
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多