태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

dbms_shared_pool.purge - 항상 꿈꿔오던 기능

오라클 2008.04.14 15:49
Oracle 10.2.0.4 Patchset에 아주 재미있고 유용한 기능이 추가되었다.

dbms_shared_pool.purge 프로시저가 그 것이다. 이 프로시저는 개인적으로 항상 꿈꿔왔던 기능을 제공한다. 그 기능이란 바로 원하는 특정 LCO(Cursor나 Procedure)를 콕 찝어서 Shared Pool에서 Flush 시키는 것이다.

SQL 문장을 튜닝하다 보면 특정 SQL 문장만 Shared Pool에서 내려버림으로써 하드 파스(Hard Parse)를 유도해야할 필요가 요구되곤 한다. 하지만, 이전 버전에서는 이런 기능이 제공되지 않기 때문에 Shared Pool을 통째로 Flush하거나, 테이블 정의를 바꾸고, 통계 정보를 수집해서 강제로 Invalidation을 시키거나 하는 편법을 사용해야 했다. 물론 이것이 얼마나 위험한 일인지는 잘 알 것이다.

아래에 dbms_shared_pool.purge 프로시저의 간단한 사용 예제가 있다.

UKJA@ukja11> select * from t_plan where c1 = 'X';

no rows selected

Elapsed: 00:00:00.00
UKJA@ukja11> select sql_id, address, hash_value
  2  from v$sql
  3  where sql_text like 'select * from t_plan where c1%';

SQL_ID                                  ADDRESS  HASH_VALUE                    
--------------------------------------- -------- ----------                    
bp49t90rx4nvf                           2269CB44  802313070                    

1 row selected.

Elapsed: 00:00:00.09

UKJA@ukja11> exec sys.dbms_shared_pool.purge('2269CB44.802313070', 'C');

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.32
UKJA@ukja11> select sql_id, address, hash_value
  2  from v$sql
  3  where sql_text like 'select * from t_plan where c1%';

no rows selected

Elapsed: 00:00:00.06

이 기능은 11g에 추가되었고 10.2.0.4 PatchSet과 10.2.0.3, 10.2.0.2 Patch 등을 이용해 하위 버전에서도 사용 가능하다. 애석하게도 모든 OS에서 다 Patch가 제공되는 것은 아니다.

자세한 내용은 Exem Wiki를 참조한다.
신고
Trackback 0 : Comments 9
  1. 박기종 2008.04.15 12:21 신고 Modify/Delete Reply

    이 기능에 대한 유용성은 인정하지만 과연 side effect는 없을까나??? 항상 patch는 걱정이 앞선다..

  2. 욱짜 2008.04.15 16:33 신고 Modify/Delete Reply

    굳이 이 기능이 필요해서 Patch를 할 필요는 없을 거 같습니다.(물론 이렇게 하는 곳도 봤습니다만...)
    10.2.0.4부터 지원되는 버전으로 인식하고 사용하는 것이 마음 편할 거 같네요.

    이 기능말고 꼭 하나 더 있었으면 하는 기능이 있습니다. 바로 특정 Buffer를 Flush시키는 기능입니다. Troubleshooting을 위해 이런 저런 테스트를 하다 보면 이 기능이 있었으면 할 때가 있는데...
    개별 LCO별, 개별 Buffer 별로 Flush가 가능하다면 개인적으로는 그야말로 환상적일거 같습니다.

  3. 강정식 2008.04.18 08:28 신고 Modify/Delete Reply

    '개별 LCO별, 개별 Buffer 별로 Flush'라 생각만해도 환상적이네요. ^^
    튜닝할 때 튜닝 전과 튜닝후를 항상 같은 세션에서 Flush가 안된 상태에서 하다보니 정확한 튜닝데이터가
    안나와서 좀 힘들었는데 이게 지원된다면 무지 좋을 것 같습니다.

  4. oracler 2008.04.18 21:34 신고 Modify/Delete Reply

    선생님 책을 최근에 보게되었는데
    서문에 세계 두번째라는 소개가 가장 인상적이었네요.
    우리나라에도 이런 뛰어난 엔지니어가 있다는 사실이 자랑스러웠습니다.

  5. 욱짜 2008.04.18 22:26 신고 Modify/Delete Reply

    부끄럽습니다. 그냥 글을 끄적이는 재주가 조금 있을 뿐입니다. 실망시키지 않도록 분발하겠습니다.

  6. 쏘심이 2008.04.19 15:24 신고 Modify/Delete Reply

    욱짜님 안녕하세요. 지식공유를 통해 많이 배우고 있습니다.

    exec sys.dbms_shared_pool.purge('2269CB44.802313070', 'C');

    여기에서 'C'가 뭔가요?? ㅡㅡㅋ

  7. 욱짜 2008.04.19 19:22 신고 Modify/Delete Reply

    아래 URL을 참조하세요.
    http://wiki.ex-em.com/index.php/DBMS_SHARED_POOL.PURGE

  8. 쏘심이 2008.04.25 18:00 신고 Modify/Delete Reply

    Cursor 군요.. 감솨합니다.

  9. 콸라 2011.05.31 14:42 Modify/Delete Reply

    관리자의 승인을 기다리고 있는 댓글입니다

Write a comment

티스토리 툴바