문서유형ㅣ기술정보
분야ㅣ모니터링/점
적용제품버전ㅣ-
문서번호ㅣTMOTI068
개요
SQL Tool 없이 tbsql으로 Plan과 Stat을 조회하는 방법입니다.
방법
수행 대상 쿼리
Select * from v$session;
테스트 전 사전 준비
GATHER_SQL_EXEC_TIME=Y
GATHER_SQL_PLAN_STAT=YSTAT 정보를 제대로 조회하기 위해서 쿼리 수행 전 아래 두개의 파라미터 설정이 필요합니다.
Tibero 에서는 해당 파라미터가 디폴트로 N 으로 설정되어 있습니다.
Tbsql 접속 후 세션 속성 설정
SQL> set lines 200
SQL> col name for a30
SQL> col value for a50
SQL> col dflt_value for a50터미널 환경에서 좀 더 가독성있게 보기 위한 세팅입니다.
set autotrace 기능 사용
사용 방법 조회
set autot trace exp plans stat 명령어로 사용할 수 있음을 확인할 수 있습니다.
해당 명령어 설정 이후 쿼리를 조회하면 위 화면과 같이 표시됩니다.
SQL_TRACE 기능 사용
SQL 수행 전에 파라미터 SQL_TRACE=Y 설정합니다.
SQL_TRACE 파일은 파라미터 TRACE_LOG_DEST 경로에 생성됩니다.
생성된 파일은 tbprof 명령어로 변환하여 확인 가능합니다.
대상 쿼리 실행 (쿼리 결과 데이터는 중요하지 않음으로 가독성을 고려하지 않았습니다)
Trace_log_dest 위치를 조회 합니다.
Tbprof 사용하여 txt 파일로 변환합니다.
생성된 텍스트 파일에서 PLAN 및 STAT 확인 가능합니다.
DBMS_XPLAN 패키지 사용
플랜 정보와 수행 정보들에 대해 항목을 다양한 포맷으로 출력할 수 있는 기능을 제공합니다.
출력 방식은 pipelined function 기능을 이용하여 TABLE() 구문을 통해 쿼리의 결과로 해당 정보들을 출력합니다. 또한 출력 정보는 V$SQL_PLAN, V$SQL_PLAN_STATISTICS 뷰를 통해서 구하기 때문에 GATHER_SQL_PLAN_STAT 파라미터가 켜져 있어야 수행 정보를 구할 수 있습니다.
DISPLAY_CURSOR
Physical Plan Cache 에 등록되어 있는 플랜에 대해 SQL_ID 값을 통해 조회하는 함수이다. pipelined function 이기 때문에 TABLE() 함수를 이용해서 사용합니다
DISPLAY_CURSOR 함수의 세부 내용은 다음과 같습니다.
프로토타입
DBMS_XPLAN.DISPLAY_CURSOR (
in_sql_id VARCHAR2 default NULL, in_child_number NUMBER default NULL,
format VARCHAR2 default 'BASIC LAST SQL')
RETURN dbms_xplan_type_table pipelined;
파라미터
| in_sql_id | 조회하려는 플랜의 SQL_ID 값입니다. 입력을 생략한 경우에는 해당 세션의 마지막 수행 쿼리의 SQL_ID 값을 사용하게 됩니다. |
|---|---|
| in_child_number | 조회하려는 플랜의 CHILD_NUMBER 값입니다. 입력을 생략한 경우에는 해당 세션의 마지막 수행 쿼리의 CHILD_NUMBER 값을 사용하게 됩니다. |
| Format | 출력하고자 하는 항목을 명시할 수 있다. 항목의 종류에는 개별 항목과 개별 항목 여러 개를 설정하는 그룹 항목이 있습니다. 항목 이름 앞에 하이픈(-)를 붙이면 해당 항목을 제외할 수 있습니다. |
개별 출력 항목
| 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, hash value, 총 수행 횟수, 총 패치 횟수, 플랜 수행 시간)를 보여줍니다 |
| SQL | 플랜 생성에 사용된 쿼리문을 보여줍니다 |
그룹 출력 항목
| IOSTATS | 수행 정보 중 IO 와 관련된 모든 항목을 보여줍니다. TEMPREAD + TEMPWRITE + BUFGETS |
|---|---|
| MEMSTATS | 수행 정보 중 메모리와 관련된 모든 항목을 보여줍니다. USEDMEM |
| ALLSTATS | 수행 정보 중 IO, 메모리와 관련된 모든 항목을 보여줍니다. IOSTATS + MEMSTATS |
| BASIC | 출력 기본 포맷으로 optimizer 에서 예측한 cardinality, cost 와 마지막 수행에 대한 노드별 수행 시간을 출력합니다. CARDS + COST + PART + ELAPTIME + LAST
|
| TYPICAL | BASIC 포맷에 추가로 마지막 수행에 대한 노드별 처리 row 수와 predicate 정보, remote sql 정보를 출력합니다. BASIC + PE + ROWS + STARTS + PRED + REMOTE + PRECISE |
| ALL | TYPICAL 포맷에 ALLSTATS 항목을 보여줍니다. TYPICAL + ALLSTATS
|
실행 결과