DBMS_XPLAN

DBMS_XPLAN 패키지의 기본 개념과 패키지 내의 프러시저와 함수를 사용하는 방법을 설명합니다.

개요

DBMS_XPLAN은 플랜 정보와 플랜의 수행 정보들에 대해 사용자가 원하는 항목을 선택해서 다양한 포맷으로 출력할 수 있는 기능을 제공합니다.

출력 방식은 pipelined function 기능을 이용하여 TABLE() 구문을 통해 쿼리의 결과로 해당 정보들을 출력합니다. 또한 출력 정보는 V$SQL_PLAN, V$SQL_PLAN_STATISTICS 뷰를 통해 얻기 때문에 GATHER_SQL_PLAN_STAT 파라미터가 켜져 있어야만 수행 정보를 정상적으로 출력할 수 있습니다.

함수

본 절에서는 DBMS_XPLAN 패키지에서 제공하는 프러시저와 함수를 알파벳 순으로 설명합니다.

DISPLAY

EXPLAIN PLAN FOR 구문을 사용하여 수행한 SQL 중 가장 나중에 수행한 SQL의 플랜을 조회하는 함수입니다. pipelined function이기 때문에 TABLE() 함수를 사용합니다.

DISPLAY 함수의 세부 내용은 다음과 같습니다.

  • 프로토타입

DBMS_XPLAN.DISPLAY
(
    format VARCHAR2 default 'BASIC LAST SQL'
)
RETURN dbms_xplan_type_table pipelined;
  • 파라미터

파라미터
IN / OUT
설명

format

IN

  • 출력하고자 하는 항목을 명시

  • 항목의 종류에는 개별 항목과 개별 항목 여러 개를 설정하는 그룹 항목이 있음

  • 항목 이름 앞에 하이픈(-)를 붙여 해당 항목을 제외 가능함

  • 개별 출력 항목

항목
설명

CARDS

optimizer에서 예측한 해당 플랜 노드의 row 수

COST

optimizer에서 예측한 해당 플랜 노드의 cost

PARTITION

파티션 관련 정보

PREDICATE

플랜 노드별 predicate 정보

REMOTE

플랜 노드별 데이터베이스 링크에 수행한 쿼리 내용

ROWS

해당 플랜 노드에서 실제 수행된 row 수

ELAPTIME

해당 플랜 노드에서 실제 수행된 시간

USEDMEM

해당 플랜 노드에서 실제 사용된 메모리 양

TEMPREAD

해당 플랜 노드에서 실제 사용된 temp read 횟수

TEMPWRITE

해당 플랜 노드에서 실제 사용된 temp write 횟수

BUFGETS

해당 플랜 노드에서 실제 요청한 buffer get 횟수

STARTS

해당 플랜 노드가 실제 재시작된 횟수

LAST

수행 정보 값을 마지막 수행 정보 값

지정하지 않은 경우 모든 수행에 대해 누적된 수행 정보 값

PRECISE

CARDS, ROWS에 대해 뒷 자리수들을 버림하지 않은 실제 값

HEADER

플랜의 기본 정보(sql id, child number, hash value, 총 수행 횟수, 총 패치 횟수, 플랜 수행 시간 등)

SQL

플랜 생성에 사용된 쿼리문

DISKREADS

해당 플랜 노드에서 실제 수행된 디스크 I/O 횟수

  • 그룹 출력 항목

항목
설명

IOSTATS

수행 정보 중 IO와 관련된 모든 항목 TEMPREAD + TEMPWRITE + BUFGETS + DISKREADS

MEMSTATS

수행 정보 중 메모리와 관련된 모든 항목 USEDMEM

ALLSTATS

수행 정보 중 IO, 메모리와 관련된 모든 항목 IOSTATS + MEMSTATS

BASIC

출력 기본 포맷

optimizer에서 예측한 cardinality, cost와 마지막 수행에 대한 노드별 수행 시간 CARDS + COST + PART + ELAPTIME + LAST

TYPICAL

BASIC 포맷에 추가로 마지막 수행에 대한 노드별 처리 row 수와 predicate 정보, remote sql 정보를 포함 BASIC + ROWS + STARTS + PRED + REMOTE + PRECISE

ALL

TYPICAL 포맷에 추가로 ALLSTATS 항목을 포함

TYPICAL + ALLSTATS

  • 예제

다음은 마지막으로 EXPLAIN PLAN FOR 구문으로 수행한 쿼리의 플랜 정보를 보는 예입니다.

DISPLAY_CURSOR

Physical Plan Cache에 등록되어 있는 플랜에 대해 SQL_ID 값을 통해 조회하는 함수입니다. pipelined function이기 때문에 TABLE() 함수를 사용합니다.

DISPLAY_CURSOR 함수의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
IN / OUT
설명

in_sql_id

(IN)

  • 조회하려는 플랜의 SQL_ID

  • 이 값이 생략된 경우 해당 세션의 마지막 수행 쿼리의 SQL_ID 값을 사용하게 됨

in_child_no

(IN)

  • 조회하려는 플랜의 CHILD_NUMBER 값

  • 이 값이 생략된 경우 입력된 SQL_ID 값과 일치하는 모든 플랜을 조회

  • CHILD_NUMBER 값은 SQL_ID 가 입력된 경우에만 지정될 수 있음

format

(IN)

  • 출력하고자 하는 항목을 명시

  • 항목의 종류에는 개별 항목과 개별 항목 여러 개를 설정하는 그룹 항목이 있음

  • 항목 이름 앞에 하이픈(-)를 붙여 해당 항목을 제외 가능함

  • 개별 출력 항목

항목
설명

CARDS

optimizer에서 예측한 해당 플랜 노드의 row 수

COST

optimizer에서 예측한 해당 플랜 노드의 cost

PARTITION

파티션 관련 정보

PARALLEL

parallel execution 관련 정보

PREDICATE

플랜 노드별 predicate 정보

REMOTE

플랜 노드별 데이터베이스 링크에 수행한 쿼리 내용

ROWS

해당 플랜 노드에서 실제 수행된 row 수

ELAPTIME

해당 플랜 노드에서 실제 수행된 시간

USEDMEM

해당 플랜 노드에서 실제 사용된 메모리 양

TEMPREAD

해당 플랜 노드에서 실제 사용된 temp read 횟수

TEMPWRITE

해당 플랜 노드에서 실제 사용된 temp write 횟수

BUFGETS

해당 플랜 노드에서 실제 요청한 buffer get 횟수

STARTS

해당 플랜 노드가 실제 재시작된 횟수

LAST

수행 정보 값을 마지막 수행 정보 값

지정하지 않은 경우 모든 수행에 대해 누적된 수행 정보 값

PRECISE

CARDS, ROWS에 대해 뒷 자리수들을 버림하지 않은 실제 값

HEADER

플랜의 기본 정보(sql id, child number, hash value, 총 수행 횟수, 총 패치 횟수, 플랜 수행 시간 등)

SQL

플랜 생성에 사용된 쿼리문

DISKREADS

해당 플랜 노드에서 실제 수행된 디스크 I/O 횟수

  • 그룹 출력 항목

항목
설명

IOSTATS

수행 정보 중 IO와 관련된 모든 항목 TEMPREAD + TEMPWRITE + BUFGETS + DISKREADS

MEMSTATS

수행 정보 중 메모리와 관련된 모든 항목 USEDMEM

ALLSTATS

수행 정보 중 IO, 메모리와 관련된 모든 항목 IOSTATS + MEMSTATS

BASIC

출력 기본 포맷

optimizer에서 예측한 cardinality, cost와 마지막 수행에 대한 노드별 수행 시간 CARDS + COST + PART + ELAPTIME + LAST

TYPICAL

BASIC 포맷에 추가로 마지막 수행에 대한 노드별 처리 row 수와 predicate

정보, remote sql 정보를 포함 BASIC + ROWS + STARTS + PRED + REMOTE + PRECISE

ALL

TYPICAL 포맷에 추가로 ALLSTATS 항목을 포함 TYPICAL + ALLSTATS

  • 예제

다음은 현재 세션에서 마지막으로 수행한 쿼리의 플랜 정보를 보는 예입니다.

다음은 기본 포맷에서 파티션 정보를 제외하고 SQL_ID 'cp2tt6ptgqws0', CHILD_NUMBER 16449인 플랜 정보를 보는 예입니다.

다음은 마지막 수행 시간, 수행 결과 row, 요청 buffer gets 값을 보는 예입니다.

다음은 수행 중 메모리 사용량과 디스크 I/O 값을 보는 예입니다.

DISPLAY_TPR

TPR에 등록되어 있는 플랜에 대해 SQL_HASH_VALUE 또는 SQL_ID 값을 통해 조회하는 함수입니다. pipelined function이기 때문에 TABLE() 함수를 사용합니다.

DISPLAY_TPR 함수의 세부 내용은 다음과 같습니다.

  • 프로토타입

  • 파라미터

파라미터
IN / OUT
설명

sql_hash_value

(IN)

  • 조회하려는 플랜의 SQL_HASH_VALUE

sql_id

(IN)

  • 조회하려는 플랜의 SQL_ID

plan_hash_value

(IN)

  • 조회하려는 플랜의 PLAN_HASH_VALUE

  • 이 값이 생략된 경우 입력된 SQL_HASH_VALUE 값과 일치하는 모든 플랜을 조회

instance#

(IN)

  • 조회하려는 플랜이 생성된 인스턴스 번호

  • 이 값이 생략된 경우 V$DATABASE의 로컬 instance_id를 사용

format

(IN)

아래 3가지 포맷을 지원

  • BASIC : OPERATION ID, NAME만 출력하고 추가적으로 옵션 사용 가능

  • TYPICAL :기본적으로 OPERATION ID, NAME, CARDS, COST를 출력하고, 해당 내용이 있을 경우 BUFGETS, ROWS, ELAPTIME, PARTITION, PREDICATE 정보도 출력 (기본값)

  • ALL : TYPICAL, REMOTE를 출력

  • 개별 출력 항목

항목
설명

CARDS

optimizer에서 예측한 해당 플랜 노드의 row 수

COST

optimizer에서 예측한 해당 플랜 노드의 cost

BUFGETS

해당 플랜 노드에서 실제 요청한 buffer get 횟수

ROWS

해당 플랜 노드에서 실제 수행된 row 수

ELAPTIME

해당 플랜 노드에서 실제 수행된 시간

PARTITION

파티션 관련 정보

PREDICATE

플랜 노드별 predicate 정보

REMOTE

플랜 노드별 데이터베이스 링크에 수행한 쿼리 내용

  • 예제

다음은 기본 포맷에서 SQL HASH VALUE 1929081600를 통해 플랜 정보를 보는 예입니다.

circle-exclamation

Last updated