在Oracle中优化复杂的多联接查询

时间:2018-12-11 10:15:33

标签: sql join oracle11g

我想优化一个我自己没有写的旧查询。我的问题是我不习惯这种联接,在两个表之间使用旧式(+)和多个子句。目前,该查询大约需要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');

我不希望有人为我重写查询,而只是指导我:

  • 我可以优化这样的查询吗?
  • 如果是,我应该使用多个子查询吗?

我尝试了一组复杂的内部联接和外部联接,但是我无法真正了解自己在做什么。 任何帮助将不胜感激。

EDIT

实际上,问题出在SELECT子句中,因为我没有在实际查询中使用SELECT *,而是将一堆外部函数应用于列,这就是为什么执行所需的时间。谢谢大家,但没有解决我的问题的方法。

1 个答案:

答案 0 :(得分:1)

调用seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { private int prevousProgressValue = 0; @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub prevoiusProgresValue = seekBar.getProgress(); //start value; } @Override public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) { // TODO something with current previousProgresValue = progress; } }); 的唯一参数来自A。

如果您执行以下操作,则通话次数可能会减少:

custom_function

这将通过消除SELECT * FROM ( SELECT A.* (SELECT custom_function(id, 'O', daytime) FROM dual) AS cf FROM A WHERE classname IN('X','Y','Z') ) A_Alias , B, C, D, E, F, G WHERE A_Alias.id = B.id AND C.id = B.id AND A_Alias.daytime >= C.daytime AND (C.end_date IS NULL OR A_Alias.daytime < C.end_date) AND A_Alias.id = D.id(+) AND A_Alias.daytime = D.daytime(+) AND A_Alias.id = E.id AND A_Alias.daytime = E.daytime(+) AND A_Alias.id = F.id AND A_Alias.daytime = F.daytime(+) AND A_Alias.cf = G.id(+) AND A_Alias.daytime = G.daytime(+); 的记录乘法效果以及确保从A中过滤掉尽可能多的行(JOIN上的条件)来减少计数。

注意:我还提供了here.的优化功能
它可能没有效果,但值得测试。
搜索以下部分:标量子查询缓存标量子查询缓存(已重访)(我邀请您阅读整个内容)。