2014-05-27 3 views
0

У меня есть хранимая процедура в Oracle 11g, которая зависает время от времени. Когда это произойдет, я не могу перекомпилировать его, и единственный вариант, который у меня есть, - это убить процесс SQL Developer. Я согласен с тем, что процедура проверяет множество записей в разных таблицах, представлениях и материализованных представлениях, но когда нет такой проблемы, для возврата набора результатов требуется всего 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; 

ответ

2

Такого рода вещи могут быть трудно диагностировать даже когда мы сидим на сервере с доступом ко всем инструментам. Дистанционно практически невозможно.

Но вот несколько наблюдений:

  1. в писателях Oracle не блокируют читателей. Таким образом, это не проблема блокировки (кроме, см. Следующий пункт). Но, возможно, одновременно происходит что-то другое, что засасывает весь системный ресурс? Вам понадобится доступ к V $ SESSION, по крайней мере, чтобы сообщить об этом и, желательно, OEM.
  2. В вашем запросе есть несколько функций (AG.CALCULATE_YEAR, GET_DATES и т. Д.). Теперь им не следует записывать состояние базы данных, но было бы полезно посмотреть, что они делают, если у них есть зависимость от конкретных ресурсов.
+0

Странная вещь, хотя, если я запускаю какой-либо SQL против любого из отношений, используемых внутри процедуры, я получаю результат при ускорении. Нет никакой проблемы, когда я выполняю функции независимо. Содержание функций настолько велико, что не стоит публиковать их здесь, но чтобы дать общее представление, эти функции также выбираются из одних и тех же таблиц, представлений. –

Смежные вопросы