【发布时间】:2019-05-12 07:27:42
【问题描述】:
我想优化一个不是我自己编写的旧查询。我的问题是我不习惯这种连接,在两个表之间使用老式 (+) 和多个子句。目前,该查询大约需要 15 分钟才能执行,因为每个表中有很多行。
SELECT *
FROM A, B, C, D, E, F, G
WHERE A.id = B.id
AND C.id = B.id
AND A.daytime >= C.daytime
AND (C.end_date IS NULL OR A.daytime < C.end_date)
AND A.id = D.id(+)
AND A.daytime = D.daytime(+)
AND A.id = E.id
AND A.daytime = E.daytime(+)
AND A.id = F.id
AND A.daytime = F.daytime(+)
AND custom_function(A.id, 'O', A.daytime) = G.id(+)
AND A.daytime = G.daytime(+)
AND A.classname IN('X','Y','Z');
我不希望有人为我重写查询,而只是为了指导我:
- 我可以优化这样的查询吗?
- 如果是这样,我应该使用多个子查询吗?
我尝试了一组复杂的内连接和外连接,但我无法真正理解我在做什么。 任何帮助将不胜感激。
编辑
其实问题出在SELECT子句上,因为我在真正的查询中并没有使用SELECT *,而是一堆外部函数应用于列,它们是执行所需时间的原因.谢谢大家,但我的问题没有解决方案。
【问题讨论】:
-
重写为显式
join语法很好,但对性能没有帮助。我会开始看custom_function。 -
@HoneyBadger 好吧,这就是我所担心的。我无法触及此功能。因此查询已经是最优的吧?
-
查询看起来很简单,但您应该检查执行计划。
-
@HoneyBadger
custom_function似乎对执行没有任何影响 -
在这种情况下你需要回到执行计划看看能做什么。