因为facctcode是 A表的主键吧~  也是B表的外键吧~
太容易看出了~用主键去单一查询当然快

解决方案 »

  1.   

    把一次性淘汰多記錄的放在後面,大表靠近from...
      

  2.   

    Nested-loop join( 内表和驱动表联结方式)
         适合于小表(几千条,几万条记录)与大表做联接,在联接列上有索引 
         分内表和外表(驱动表),靠近from子句的是内表。从效率上讲,小表应该作外表,大表应该作内表,即大表查询时走索引 
         COST= Access cost of A(驱动表) + (access cost of B * number of rows from A)
      

  3.   

    sozdream大哥既然看出来了,那能说说有什么办法能提高我第一种方法的效率吗?
      

  4.   

    shyming,我的大表,就是表A,这么放应该没有问题吧?
      

  5.   

    A.fdate between to_date('2006-01-01', 'yyyy-MM-dd') and
           to_date('2006-06-30', 'yyyy-MM-dd')如果非要用第一种方法, 那就在这个字段上放个索引吧, 因为A表行数多, 建索引查询起来快。  不过要看你A.fdate的数据情况, 如果重复性很高的话, 那索引建了虽然可以提高速度, 但不划算, 尽量建在A表重复性低,没什么null值的字段上。
      

  6.   

    select sum(FBAL) / 181 as famount
    from T_A A LEFT JOIN T_B B on A.fportfoliocode = B.fportfoliocode and A.facctcode = B.facctcode AND B.fyear = '2006'
    where  A.fdate between to_date('2006-01-01', 'yyyy-MM-dd') and
           to_date('2006-06-30', 'yyyy-MM-dd') 
           and B.facctattr like '银行存款_定期%' and B.FacctDetail = 1
           and A.fcurrencycode = 'RMB' and
           and A.fportfoliocode in ('000001', '000004') 
           如果慢,在Toad工具里解析看看索引的使用情況,A.fportfoliocode in ('000001', '000004')應該也會用到索引的。 
      

  7.   

    如果索引也有用到,還是很慢就像sozdream講的建立索引比較好啦,如果以後類似應用多的話,按照查詢條件建立複合索引是最快的。
      

  8.   

    谢谢shyming,速度没有什么变化
      

  9.   

    把facctattr设置为主键,且设置索引后,速度提高了一点,但也好要10秒的时间
      

  10.   

    A表用fdate,fcurrencycode,fportfoliocode建立複合索引了嗎?
      

  11.   

    alter table T001_LACCOUNT
      add primary key (FACCTATTR,FPORTFOLIOCODE,FACCTCODE,FYEAR)
      using index 
      tablespace YSSZT
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );这应该是我现在索引的建立SQL
      

  12.   

    create index owner.Index_name on T001_LACCOUNT (fdate,fcurrencycode,fportfoliocode);