我想优化一个我自己没有写的旧查询。我的问题是我不习惯这种联接,在两个表之间使用旧式(+)和多个子句。目前,该查询大约需要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 *
,而是将一堆外部函数应用于列,这就是为什么执行所需的时间。谢谢大家,但没有解决我的问题的方法。
答案 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.的优化功能
它可能没有效果,但值得测试。
搜索以下部分:标量子查询缓存和标量子查询缓存(已重访)(我邀请您阅读整个内容)。