오라클 패키지 종속성 관련 질문이 있습니다. 0 2 1,532

by jkson [2016.11.09 21:03:26]


질문1)

http://m.axiominfo.co.kr/default/article/column.php?com_board_basic=read_form&com_board_idx=66&&com_board_search_code=&com_board_search_value1=&com_board_search_value2=&com_board_page=6&&com_board_category_code=c1
 

패키지를 사용해야 하는 이유로 종속성 체인 제거라는 게 있는데요.

일반 프로시저의 경우

테이블 X의 변경 -> 일반 프로시저 A invalid -> 일반 프로시저 A를 사용하는 일반 프로시저 B invalid

-> 일반 프로시저 B를 사용하는 일반 프로시저 C invalid -> D -> E

이런 상황일 때 일반 프로시저 B를 실행하면 A빌드 E -> D -> C -> B -> A 순으로 컴파일

와 같은 상황이 올 수 있는데

패키지를 사용하면

테이블 X의 변경 -> 패키지 바디 A invalid -> 패키지 A를 사용하는 패키지 바디 B 는 valid

따라서 패키지 바디 A만 재실행 시점에 컴파일됨

따라서 컴파일 부담이 줄어듦.

이렇게 이해하는 게 맞나요?

 

질문2)

http://ukja.tistory.com/13

질문2-1) 링크 보면 "library cache pin이라는 이름의 대기 현상의 증가" 한다고 되어있는데

세션1에서 일반 프로시저 A 호출후  labrary cache pin ->

테이블 X의 변경 -> 일반 프로시저 A invalid ->

-> 다른 세션2에서 일반 프로시저 A 호출후 labrary cache pin 시도, 세션1에서 labrary cache pin 중이므로 대기

-> 다른 세션3에서 일반 프로시저 A 호출후 labrary cache pin 시도, 세션1에서 labrary cache pin 중이므로 대기

-> 일반 프로시저 A를 사용하는 다른 프로시저들에게서도 같은 현상 발생

이런 식으로 labrary cache pin 대기 현상 증가

이런 상황인 게 맞나요?

질문2-2) 패키지를 사용하면 labrary cache miss가 발생하지 않는다라고 되어있는데요.

BEGIN pkgtest.pkgtest_proc(1); END;

이 상황에서 Misses in library cache during parse: 0 인데

제가 약간 궁금한 게 패키지는 valid이지만 패키지 바디는 invalid 상황이고

처음 재수행 시점에서 valid로 바뀌잖아요? 이때는 library cache miss 되면서 컴파일을 하게 되지 않나요?

제 생각에는 pkgtest.pkgtest_proc을 사용하는 다른 오브젝트가 invalid가 아니니까

다른 오브젝트에서 콜할 때만  labrary cache miss가 발생하지 않을 것 같은데요..

제가 잘못 이해한 건가요?

 

질문3)

http://ukja.tistory.com/29

이 링크를 보면

테이블 X의 변경 -> 테이블 X를 사용하는 function A invalid

-> 해당 function을 사용하는 모든 sql 문장 무효화

라고 되어있는데 여기서 '무효화'라는 게 정확히 어떤 의미인지요?

labrary 캐시에서 해당 function을 사용하는 모든 쿼리가 지워진다는 의미인가요?

 

질문이 많이 기네요. 공부하면서 제 생각대로 이해한 부분이 많아서 혼자 착각하고 있는 부분이

엄청 많을 것 같습니다ㅠㅠ

아.. 내일 해외에 나가야해서 어쩌면 당분간 답글 확인을 못 할 수도 있습니다.

다녀와서 정독해보겠습니다. 답변 부탁드릴게요~^^

by 미스틱매니아 [2016.11.10 14:12:05]

보니까 이런 이야기 같네요.

1. table invalid -> 참조 function/procedure invalid -> (반복) -> 해당 객체 사용 쿼리도 invalid 인데 package를 쓰면 table invalid -> 참조 package body invalid -> 하지만 package는 valid -> 때문에 참조하는 다른 객체나 쿼리도 valid로 남게되므로 package 이후의 객체들은 재컴파일이 안발생함.

 

2. 객체가 invalid가 되면 관련 DD및 참조 쿼리의 Plan이 캐쉬에서 삭제가 됩니다. 때문에 Hard Parse가 발생하게 되고 이때문에 library cache pin이 발생하게 됩니다. 하지만 이 글대로 라면 Package 자체는 valid이므로 plan이 캐시에서 지워지는 일도 안생기고, hard parse 없이 recompile만 발생하게 된다는거 같네요. 이럼 library cache 관련 부하도 없겠죠.

 

3. 2에서 썼지만 참조하는 객체가 invalid 된 쿼리의 plan은 캐시에서 삭제됩니다. plan이 invalidate 된다고 보면 될듯요. 

 

이건 저도 처음 본 내용이라서 흥미롭네요...한번 제대로 확인 해봐야 겠습니다.


by jkson [2016.11.15 07:59:45]

답변 감사합니다. 도움이 되었습니다~

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입