Performance 存储过程偶尔挂起

Performance 存储过程偶尔挂起,performance,oracle,stored-procedures,locking,Performance,Oracle,Stored Procedures,Locking,我在Oracle11g中有一个存储过程,它会一次又一次地挂起。当这种情况发生时,我也不能重新编译它,我唯一的选择就是终止SQLDeveloper进程。我同意这个过程会扫描不同表、视图和物化视图中的大量记录,但是如果没有这样的问题,只需要1-2秒就可以返回结果集。我尝试过终止所有会话,甚至重新启动数据库,但似乎没有任何帮助。而它只是被自己修复了。我正在发布程序内容,以备您需要查看 create or replace PROCEDURE

我在Oracle11g中有一个存储过程,它会一次又一次地挂起。当这种情况发生时,我也不能重新编译它,我唯一的选择就是终止SQLDeveloper进程。我同意这个过程会扫描不同表、视图和物化视图中的大量记录,但是如果没有这样的问题,只需要1-2秒就可以返回结果集。我尝试过终止所有会话,甚至重新启动数据库,但似乎没有任何帮助。而它只是被自己修复了。我正在发布程序内容,以备您需要查看

    create or replace
PROCEDURE                                     SP_STAJ_FOR_AGAPUS(
    V_SSN IN NUMBER,
    V_WEYEARNEW OUT NUMBER,
    V_WEMONTHNEW OUT NUMBER,
    V_WEDAYNEW OUT NUMBER,
    V_LS_YEAR OUT NUMBER,
    V_LS_MONTH OUT NUMBER)
AS
BEGIN
  SELECT NVL(TRUNC(MDC.DAY_COUNT / 360),0) WEYEARNEW, NVL(TRUNC(MOD(MDC.DAY_COUNT,360) / 30),0)
    WEMONTHNEW, NVL(MOD(MOD( MDC.DAY_COUNT,360),30),0) WEDAYNEW,NVL(LS.LS_YEAR,0)LS_YEAR,NVL(
    LS.LS_MONTH,0)LS_MONTH
  INTO V_WEYEARNEW,V_WEMONTHNEW,V_WEDAYNEW,V_LS_YEAR,V_LS_MONTH
  FROM SSPF_CENTRE.PERSONS PER
  LEFT JOIN
    ( SELECT SSN, SUM(DAY_COUNT) DAY_COUNT FROM
        ( SELECT SSN, YEAR, AG.CHECK_PERIOD_MDSS(SSN,YEAR) DAY_COUNT FROM
            ( SELECT SSN, YEAR FROM SSPF_CENTRE.PERSON_ACCOUNTS GROUP BY SSN,YEAR
            UNION ALL
            SELECT SSN, SPECIAL_YEAR YEAR
        FROM SSPF_CENTRE.person_accounts_06
        GROUP BY SSN,SPECIAL_YEAR            
            UNION ALL SELECT
                P.COMMON_SSN, PA.YEAR FROM SSPF_CENTRE.PERSON_ACCOUNTS PA, SSPF_CENTRE.PERSONS P
              WHERE
                --COMMON_SSN = V_SSN AND
                PA.SSN = P.SSN(+) AND P.COMMON_SSN <> P.SSN GROUP BY P.COMMON_SSN,PA.YEAR
            ) GROUP BY SSN,YEAR
        ) GROUP BY SSN
    ) MDC ON PER.SSN=MDC.SSN
  LEFT JOIN
    ( SELECT SSN, AG.CALCULATE_YEAR(LS_DAYS) LS_YEAR, AG.CALCULATE_MONTH( LS_DAYS) LS_MONTH FROM
        ( SELECT SSN, GET_DAYS(SSN) LS_DAYS FROM MAT_SERVICE_NEW GROUP BY SSN
        )
    ) LS ON PER.SSN=LS.SSN
  WHERE PER.SSN=V_SSN;
EXCEPTION
WHEN NO_DATA_FOUND THEN
  BEGIN
    V_WEYEARNEW:=0;
    V_WEMONTHNEW:=0;
    V_WEDAYNEW:=0;
    V_LS_YEAR:=0;
    V_LS_MONTH:=0;
  END;
END SP_STAJ_FOR_AGAPUS;

即使我们坐在能够访问所有工具的服务器上,这种事情也很难诊断。远程控制几乎是不可能的

但以下是一些观察结果:

在Oracle中,编写器不会阻止读卡器。所以这不是一个锁定问题,除非看到下一点。但是,可能有其他事务同时发生,占用了所有系统资源?您至少需要访问V$SESSION才能知道这一点,最好是OEM。 您的query AG中似乎有几个函数。CALCULATE_YEAR、GET_DATES等。现在它们不应该写入数据库状态,但值得一看它们的功能,以防它们依赖于特定的资源。
但奇怪的是,如果我对过程中使用的任何关系运行任何SQL,我会以极快的速度得到结果。当我独立执行函数时,没有问题。这些函数的内容非常庞大,因此在这里发布它们不是一个好主意,但是为了给出一个总体概念,这些函数也从相同的表、视图中进行选择。