执行的语句如下:
      INSERT /*+PARALLEL( A ,5)*/
      INTO MASAKR.TB_KR_MID_MERGE_USER_MON  a
      SELECT  /*+PARALLEL(A,7)*/  /*+PARALLEL(B,7)*/    
        V_DATE, NVL(B.USER_TYPE,A.USER_TYPE),NVL(B.USER_ID,A.USER_ID)    ---- V_DATE  为日期变量
      FROM    MASAKR.TB_KR_TEMP_02_MERGE_USER_MON  A 
      FULL OUTER JOIN  MASAKR.TB_KR_TEMP_01_MERGE_USER_MON  B
      ON a.user_id  =b.user_id ; 
两种情况下的执行计划。
在SQLPLUS执行时执行计划是(1)
    SQL:   INSERT   STATEMENT
        VIEW
          UNION-ALL
             HASH JOIN (OUTER)
                 MASAKR.TB_KR_TEMP_02_MERGE_USER_MON    (TABLE ACCESS FULL)
                 MASAKR.TB_KR_TEMP_01_MERGE_USER_MON    (TABLE ACCESS FULL)
             HASH JOIN (ANTI)
                 MASAKR.TB_KR_TEMP_01_MERGE_USER_MON    (TABLE ACCESS FULL)
                 MASAKR.TB_KR_TEMP_02_MERGE_USER_MON    (TABLE ACCESS FULL) 
大约需要4分钟执行结束但在后台调度时,其执行计划(2)  4个小时没出来结果。
    SQL:   INSERT   STATEMENT
        VIEW
          UNION-ALL
             HASH JOIN (OUTER)
                 MASAKR.TB_KR_TEMP_02_MERGE_USER_MON    (TABLE ACCESS FULL)
                 MASAKR.TB_KR_TEMP_01_MERGE_USER_MON    (TABLE ACCESS FULL)
             FILTER 
                 MASAKR.TB_KR_TEMP_01_MERGE_USER_MON    (TABLE ACCESS FULL)  
                 MASAKR.TB_KR_TEMP_02_MERGE_USER_MON    (TABLE ACCESS FULL)

解决方案 »

  1.   

    后台调度:是在那里执行?你的SQL语句全都是全表扫描
    如果记录多的时候,想得到结果就很慢了
      

  2.   

    HASH JOIN (ANTI)
    肯定快些,但为什么后台程序的执行计划不一样呢?
      

  3.   

    我找到原因了,是数据库9i的BUG。
      

  4.   

    连接吗!权标扫描是不可以避免的!我觉得可能不是bug当两个控制(如两个sql_plus)控制一个数据库表的时候,比如更改,插入操作,数据库会进行锁操作!也就是后进行的控制将长时间停滞!希望楼主不要误会Oracle的好意!
      

  5.   

    的确是ORA的BUG。
    上述过程单进程没有任何问题,1000万 连接 900万的记录 4分钟就可结束。
    若用子进程,就出现BUG,就是 HASH JOIN 在子进程中存在BUG