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;파라미터
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_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 함수의 세부 내용은 다음과 같습니다.
프로토타입
파라미터
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를 통해 플랜 정보를 보는 예입니다.
주의
첫 번째 파라미터 값으로 '1929081600'처럼 사용 시 VARCHAR 타입인 SQL_ID로 인식됩니다.
SQL HASH VALUE를 입력하고자 하면 ' ' 없이 사용하거나, sql_hash_value=>'1929081600'와 같이 명시적으로 파라미터를 지정합니다.
Last updated

