2010-11-23 3 views
3

먼저 오라클입니다. 이걸하면 ...왜 저장 프로 시저가 영원히 실행 되겠지만 프로 시저의 코드는 자체적으로 빠르게 실행됩니까?

execute my_package.sp_execute_my_procedure('...', '...'); 

무한히 실행됩니다 (나는 밤새지나 가게합니다).

그러나 저장 프로 시저에서 코드를 가져 와서 pl/sql 익명 블록으로 치고 declare 키워드를 단일 커서에 놓고 실행하면 10 분 내에 완료됩니다. 얼마나 오래 걸릴지.

적어도 모든 코드를 게시하지 않고서는 누구도 이런 것을 본 적이 없습니까?

업데이트 : 좋아요, 그래서 내가 v $ session에서 선택했을 때 proc을 실행하는 중에 "UNKNOWN"blocking_session_status 이벤트가 "direct path write temp."와 함께 나타납니다.

나는 아직까지 의미하는 바를 지금까지 한 적이 거의 없다고 말할 수는 없다.

+0

절차는 무엇입니까? 자물쇠 나 무언가를 무기한 기다릴 수 있습니까? –

+0

proc에는 최소한 잠금 장치를 보유 할 요소는 없습니다. 그것은 기본적으로 큰 select를 가지고 있습니다. 그리고 나서 select의 각 행에 대해 전체 삽입을합니다. – Carter

답변

3

그것은 심지어 코드를 실행하기 전에 세션을 차단하고 패키지 개체에 대한 경합의 일종이 가능하다.

execute 명령이 걸려있는 동안 V$SESSION을 쿼리하여 해당 세션이 무엇을 기다리고 있는지 확인하십시오.

0

PL/SQL 코드가 바인드 변수를 사용하고 DECLARE 블록이 리터럴을 사용합니까? 이로 인해 다른 계획과 다른 성능이 발생할 수 있습니다. 내가 저장 프로 시저의 코드를 가지고가는 경우에

+0

PL/SQL 파라미터 같이 선언 블록 바인드 변수를 사용하여 전달되는 변수를 사용한다. – Carter

0

그러나, 10 분처럼에서 완료, 그것을하는 PL/SQL 익명 블록으로 때리고 내 단일 커서의 선언 키워드를 넣고 실행합니다.

...

그것은 기본적으로 가지고있는 다음은 삽입의 전체 무리를 수행하는 선택의 각 행에 대해 선택 큰.

당신은 삽입 여부를 포함나요?

+0

예, 정확히 proc이 수행하는 작업이 포함되어 있습니다. 어느 것이 선택하고 삽입하고 있는가? – Carter