把第二条语句中的b.ftype=1和t.fdatetime=b.fdatetime  调换一下位置呢?会不会快些?

解决方案 »

  1.   

    数据量的问题,第一条语句是在筛选后进行的两表全连接,相对与第2种情况,数据量肯定要小很多.
    如果 a 10条  b 100条 --直接连接 1000条 , 筛选后 a 剩下3  b剩下 10 连接是30条,再分组查询
    你说谁快.
      

  2.   

    第一条sql
    and b.fdatetime>=to_date('2004-11-30','yyyy-mm-dd') 
    and b.fdatetime<=to_date('2004-11-30','yyyy-mm-dd') 
    怎么既大于等于又小于等于?
    第二条sql
    t.fdatetime=b.fdatetime
    这两个字段的数据在表里面本身都是0点整么?我估计你的问题就出在这
    t.fdatetime=b.fdatetime 应紧跟在where后面
    最大过滤的条件应放在where的最后面
      

  3.   

    就是Lokioo((火神啊!)) 说的道理。
      

  4.   

    问题在表的连接上,第一种方法分组检索出来后再连接的,第二中方法连接后再分组,资源都消耗在连接表的过程中。如果在total_reg表的fdatetime字段上加索引,第二种方法效率可能有所改观。
      

  5.   

    oracle数据库在解析SQL语句时,是逆向解析的。所以写SQL语句时最好遵循以下原则:
    FROM后有N(N>=2)个表时,数据量最小的表一定要放在最后,依次类推。
    WHERE后有N(N>=2)个条件时,条件限制严格的一定要放在最后,依次类推。
    否则的话,在其他条件保持不变的情况下,执行效率会有数量级的差异。
    这是经过N次测试得出的结果
      

  6.   

    第一条语句在from后面oracle会将成生成内部视图.
    在生成内部视图之后会使查询效率快速提升.至少这是其中一个原因.
      

  7.   

    Lokioo((火神啊!)) :
        如果是这样,岂不是关联多表查询时,都应该提倡的一种方式,可是大部分书上、学习的内容都是第二种方式呢,我想第二种方式是不是也有它的优点呢?
      

  8.   

    请用set autotrace onlytrace;
    查看执行计划.
      

  9.   

    应该 是:
    set autotrace traceonly;