解决方案 »

  1.   

    请提供执行计划
    看语句应该是
    (select count(*) from Table1 t where t.Column1 = v.Column3) alias1,
    (select count(*) from Table1 t where t.Column2 = v.Column4) alias2
    这两个子查询耗时较多
      

  2.   

    改为这样试试,不行的话请提供执行计划,针对性优化
    select v.*,A.alias1,B.alias2
    from 
        (select Column1,count(*)  as alias1 from Table1  group by Column1) A,
        (select Column2,count(*)  as alias2 from Table1  group by Column2) B,
        Table2 v
    where A.Column1 = v.Column3 and B.Column2 = v.Column4
    and(Condition1 between trunc(sysdate, 'dd') - 1 and trunc(sysdate, 'dd') + 2
     or Condition2 between trunc(sysdate, 'dd') - 1 and trunc(sysdate, 'dd') + 2)
      

  3.   

    多谢 bw555,因为原本的SQL比这个还要复杂一点,而且表名,列名有点出入,所以执行计划不太一样,可能看起来比较吃力。另外,我已经按照您的code进行了修改,速度变化很大,得到了很大的提升,非常感谢,不过两个SQL搜出来的结果集的数量不太一样,不知道哪里有问题,我正在研究。
      

  4.   

    应该是关联条件的事,改为右连接,应该就好了
    A.Column1 = v.Column3(+) and B.Column2 = v.Column4(+)
      

  5.   

    如果Table2中存在某些记录在Table1中找不到对应的记录,这些记录用原来的语句是查不出来的,改为右连接应该就可以了
      

  6.   

    这个or  有问题啊  
    是不是应该这样select v.*,A.alias1,B.alias2
    from 
        (select Column1,count(*)  as alias1 from Table1  group by Column1) A,
        (select Column2,count(*)  as alias2 from Table1  group by Column2) B,
        Table2 v
    where A.Column1 = v.Column3 and B.Column2 = v.Column4
    and((Condition1 between trunc(sysdate, 'dd') - 1 and trunc(sysdate, 'dd') + 2)
     or (Condition2 between trunc(sysdate, 'dd') - 1 and trunc(sysdate, 'dd') + 2))
      

  7.   

    这个没必要的,between and 可以自己处理的,加不加括号效果是一样的,我曾经做过实验的
      

  8.   

    这么谦虚,呵~
    sql调优方面,以前很在意写法带来的性能差异,但现在偏向于从数据量,索引的角度看.
      

  9.   


    bw555, 两个SQL已经完全一致了,非常感谢大神,结贴了。