지인으로부터 아래와 같은 질문을 받았다.

 

질문 : Predicate Information을 참조하려면 DBMS_XPLAN 패키지를 사용해야만 합니까?

       저희 개발자들은 DBMS_XPLAN 패키지를 사용할 권한이 없습니다.
       따라서
오렌지나 TOAD에서 간단히 볼 수 있는 방법이 필요합니다. 가능 합니까?

 

답변 : 볼 수 있습니다. 단 PLAN_TABLE을 볼수 있는 권한은 있어야 합니다.


요청: 그건 있습니다. 방법을 블로그에 올려주시면 나머지 사람들도 볼수 있겠네요. 올려주시죠.

이렇게 해서 이글을 작성 하게 되었다. 이런 질문을 받았다는 것은 2가지 의미로 해석할 수 있다. 첫번째, 의외로 오렌지나 TOAD의 기능을 모르는 사람이 많이 있을 수 있다는 의미다. 두번째, 튜닝에 필요한 권한이 개발자에게 없다는 안타까움 이다. 이 정책은 매우 아쉬운 선택이며 앞으로 개선되기를 기대해본다. 하지만 수정이 필요한 법이나 악법도 법이므로 수정되기 전까진 따라야 한다.

Predicate Information과 관련된 가장 흔한 오류는 10046 이벤트 + tkprof를 사용하면 Predicate Information을 볼수 있다고 착각 하는 것이다. 절대 볼수 없다. 

Predicate Information이 뭐지?
Predicate Information
이란 인덱스 scan 시의 컬럼 액세스 정보, 조인정보, filter 정보를 각 Opreation 단위로 나타낸 것이다. 아래의 예제를 보자.
 

explain plan for

SELECT /*+ LEADING(e) USE_NL(d) */

       e.employee_id, e.first_name, e.last_name, e.email, e.salary

  FROM employee e, department d

 WHERE e.department_id = d.department_id

   AND e.job_id = 'SH_CLERK';

  

select * from table(dbms_xplan.display);  


-------------------------------------------------------------------------------

| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)|

-------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |            |    20 |   860 |     3   (0)|

|*  1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEE   |    20 |   860 |     3   (0)|

|*  2 |   INDEX RANGE SCAN          | EMP_JOB_IX |    20 |       |     1   (0)|

-------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter("E"."DEPARTMENT_ID" IS NOT NULL) --> FILER 정보가 출력됨

   2 - access("E"."JOB_ID"='SH_CLERK')         --> INDEX SCAN 정보 혹은 JOIN 정보가 출력됨

 

FILTER ACCESS 정보는 중요하다

위에서 출력된 Predicate Information을 보면 FILTER INDEX SCAN 정보를 정확히 볼 수 있다. 특히 인덱스가 여러 개의 컬럼으로 구성된 경우 몇 번째 컬럼까지 액세스 되었는지 보려면 Predicate Information이 필수적인 것이다. 예를 들어 인덱스가 COL1 + COL2 + COL3로 되어 있는데 Predicate Information에서 INDEXSCAN에 사용된 컬럼이 하나뿐이고 COL2 COL3는 테이블의 FILTER로 풀린다면 성능에 문제가 될 수 있다. 따라서 Predicate Information을 확인 하는 것은 매우 중요한 것이다.

 

문제는 이처럼 중요한 정보를 DBMS_XPLAN 패키지를 사용하지 않고 'TOAD나 오렌지에서 어떻게 볼수 있냐' 이다.

지금부터 따라 해보기 바란다.

 

1. TOAD에서 Predicate Information 보기

먼저 토드 화면에서 EXPLAIN PLAN을 실행한다. EXPLAIN PLAN은 구급차 아이콘을 누르면 된다.

사용자 삽입 이미지

그러면 위와 같은 화면이 출력될 것이다. 위의 화면에서는 Predicate Information가 없다. 지금부터 Predicate Information을 추가해보자.

사용자 삽입 이미지

먼저 TOAD 화면의 하단(Explain Plan) 탭에서 오른쪽 버튼을 클릭한다. 연이어 Adjust Content를 선택한다.


사용자 삽입 이미지

그러면 위와 같은 화면이 뜨는데 여기서 Access Predicates Filter Predicates Visible 항목을 체크하고 OK를 클릭한다.

사용자 삽입 이미지

위와 같이 TOAD에서 Access Predicates Filter Predicates가 깔끔하게 출력되었다.


2. 오렌지에서
Predicate Information 보기

오렌지를 사용한다면 PLAN TOOL에서 Show Plan버튼을 클릭하거나 Function F5를 누르고 하단의 세번째 탭을 클릭하면 아래의 그림처럼 Predicate Information을 볼 수 있다.

사용자 삽입 이미지

확인하는 습관이 필요해
이로써 어디서든 무엇을 사용하든 버튼 클릭 만으로 Predicate Information을 볼 수 있게 되었다. 이제부터 Predicate Information을 애용하기 바란다. 특히 Index Scan 시에 몇번째 컬럼까지 이용하였는지 확인하는 습관이 필요하다.

PS :
필자는 TOAD나 오렌지의 제조사나 판매사와는 상관없는 사람이다. 단지 가끔 이용할 뿐...



Posted by extremedb

댓글을 달아 주세요

  1. 익명 2010.01.12 18:14  댓글주소  수정/삭제  댓글쓰기

    실제 오렌지나 토드에 나오는게 run time predicate information 인가요?

  2. feelie 2010.01.13 09:21  댓글주소  수정/삭제  댓글쓰기

    TOAD을 꽤 오랜기간 사용했는데도 아직 TOAD의 기능 대부분을 사용안하는것 같네요.
    TOAD만 제대로 사용해도 왠만한 성능 문제를 해결할수 있다고 들었는데 아직
    메뉴얼한번 제대로 읽어본적이 없네요..
    제 생각은 오라클의 내부적인 부분을 이해하고 그다음에 TOAD의 기능을 사용할려고 하는데요.
    오라클 내부적인 부분을 이해하는데 무척 오랜 시간이 필요한것 같네요..( 아직 많이 모자라서...)
    조금씩 나질것으롤 생각하고, 열심히 할렵니다..

    • Favicon of https://scidb.tistory.com BlogIcon extremedb 2010.01.13 10:11 신고  댓글주소  수정/삭제

      좋은 접근방법입니다.
      처음부터 토드등을 사용한다면 나중에 SQL PLUS를 사용할수도 없게 될것입니다.내부원리를 알고 토드의 기능을 사용하는 것도 올바른 접근법 입니다.

  3. 백면서생 2010.01.15 09:58  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. extremedb님 .
    늘 좋은 자료와 tip을 올려주시네요.
    늦었지만 새해 복 많이 받으시고 올해도 뜻하시는 일이 잘 이루어지길 바랍니다.
    물론 가족과 님의 행복을 포함해서요~

    p.s) 책 너무 오래 출판 안하시면 안사버릴겁니다.ㅋ

    • Favicon of https://scidb.tistory.com BlogIcon extremedb 2010.01.15 10:31 신고  댓글주소  수정/삭제

      오랜만입니다.
      잘 지내시죠?
      백면서생님께서도 새해 소망하는 일 모두 이루시길 기원합니다.
      P.S)말씀하신대로 기한을 넘기지 않도록 하겠습니다.
      한줄의 압력으로 책임이 무거워 지네요.^^

  4. Favicon of https://1ststreet.tistory.com BlogIcon SITD 2011.05.12 21:20 신고  댓글주소  수정/삭제  댓글쓰기

    오렌지에서 해당 쿼리를 블럭으로 선택하고 Ctrl + Shift + E를 누르면 한번에 플랜으로 가더군요.

    은근히 편해요.

    그리고 플랜에서 Ctrl + Enter을 치면 쿼리가 실행되고, F5를 누르면 실행계획이 나오더군요