存储过程
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 ;结果同时启动这几个存储过程,发现同一时刻工作的只有一个,其余的虽然是运行状态,但在等待。
以前是并行执行的。
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 ;结果同时启动这几个存储过程,发现同一时刻工作的只有一个,其余的虽然是运行状态,但在等待。
以前是并行执行的。
*、检查多个进程同时运行时会不会产生重复纪录。如果你确认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有时候会出些奇奇怪怪的错误。