存储过程  
create or replace procedure sp
(
 v_char_date   IN   VARCHAR2,                      --20030901
          v_area        IN   VARCHAR2,
 v_statuscode OUT NUMBER)
AS
BEGIN
      INSERT /*+parallel(A,5)*/ INTO  T1  A
      SELECT /*+parallel(b,5)*/  
      emp_id,sum(pay)
      from  emp_t b
      where date=v_char_date   
      and   area=v_area ;
      commit ;
      v_statuscode  :=0 ;
      return ;
END;
SP1----5  均如下
CREATE OR REPLACE PROCEDURE SPX(
   v_char_date   IN   VARCHAR2,            
   v_code OUT NUMBER) AS   V_AREA_CODE      varchar2(5);
   v_statuscode           number ;
BEGIN  
  v_area_code      :=X;   ----X   =  1,2,3,4,5
  v_statuscode     :=0;
  sp_dwmk_gsm_list_per_d_sum(v_char_date,v_area_code,v_statuscode) ;
  v_code  :=v_statuscode ;
  RETURN;
END ;结果同时启动这几个存储过程,发现同一时刻工作的只有一个,其余的虽然是运行状态,但在等待。
以前是并行执行的。

解决方案 »

  1.   

    *、如果只有一个执行而其他都在等待,大致可以猜测是因为纪录被锁
    *、检查多个进程同时运行时会不会产生重复纪录。如果你确认sp1-5中操作的数据不会在目的表T1中产生重复,那最可能的原因是整个表T1被锁。据我知道,dml操作中只有insert /*+ append */ 操作会锁定整个表,因为append会跳过rollback,无法rollback。其他的操作只会产生行级锁。
    *、我用parallel用的非常多,因为我们的服务器有24个cpu,但是我从来没有尝试过在insert中提示parallel,不明白这么用什么意义,做了一下explain paln,insert中加不加parallel对结果没有任何影响。
    *、在select 中使用parallel在多cpu系统中效率有非常大的提高,但是parallel只在做full table scan 的时候有效,看你的语句中在date、area的条件,应该是用到了索引,否则对大表效率会很成问题。这种情况下,parallel是没有意义的,oracle不会采用这个hint。看不出出错的具体原因,建议你把parallel去掉试试,oracle有时候会出些奇奇怪怪的错误。