DBMS_XPLAN.DISPLAY_CURSOR
: 10g 부터 지원
: 9i 에서는 trace 10046 사용해야함
해당 패키지를 사용하기 위해서는 일반 DB유저에게 아래와 같은 권한을 부여해야한다.
GRANT SELECT ON V_$SESSION TO 사용자;
GRANT SELECT ON V_$SQL_PLAN_STATISTICS_ALL TO 사용자;
GRANT SELECT ON V_$SQL TO 사용자;
사용법.
1. 실행 계획을 검토할 문장에 힌트 /*+ gather_plan_statistics */ 삽입 후 실행
2. select * from table(dbms_xplan.display_cursor(null,null,'TYPICAL ALLSTATS LAST')); 실행
예)
SELECT /*+ gather_plan_statistics */ *
FROM TUNING.ORDERS
WHERE CODE = 10;
select * from table(dbms_xplan.display_cursor(null,null,'TYPICAL ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
SQL_ID 1xsrwsu9684v1, child number 0
-------------------------------------
SELECT /*+ gather_plan_statistics */ * FROM TUNING.ORDERS WHERE CODE =
10
Plan hash value: 231671837
----------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time | Buffers | Reads |
----------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | | 8863 (100)| | 8856 |00:00:00.01 | 8891 | 8776 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| ORDERS | 1 | 8911 | 452K| 8863 (1)| 00:00:01 | 8856 |00:00:00.01 | 8891 | 8776 |
|* 2 | INDEX RANGE SCAN | ORDERS_CODE_IDX | 1 | 8911 | | 31 (0)| 00:00:01 | 8856 |00:00:00.01 | 120 | 0 |
----------------------------------------------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CODE"=10)
PLAN_TABLE_OUTPUT
SQL ID = 힌트를 넣은 SQL 의 ID, Shared Pool 에 저장이 되어 있다면 추후에도 확인이 가능
PLAN HASH VALUE : 실행계획에 종속적인 값
SQL ID는 같아도 PLAN HASH VALUE 값은 다를 수 있음, -> 실행계획이 변경 된 것
항목 | 설명 |
Id | 일련번호 |
Operation | 작업명 |
Name | 사용되는 객체명 |
Starts
|
실행 횟수 |
일반적으로 NESTED LOOP JOIN이나 SORT MERGE JOIN에서 선행 데이터 건수가 해당 값이 됨 | |
E-Rows | 실행 단계별 예상 건수 |
옵션에 -rows를 사용하면 나타나지 않음 | |
A-Rows | 실행 단계별 실제 건수 |
A-Time
|
실행 단계별 걸린 시간 |
누적 값이며 1/100초까지 측정 된다. 누적 값이므로 해당 작업에서 소요된 시간을 구하려면 이전 단계의 값을 차감해주어야 한다 | |
Buffers | Logical I/O(BUFFER CACHE에서 읽음)에 의해 읽은 블록 수. 누적 값이므로 해당 작업에서 읽은 블록 수를 구하려면 이전 단계의 값을 차감해주어야 한다 |
Reads
|
I/O(DISK에서 읽음) |
실행 계획을 비교할 때는 Reads 횟수를 비슷하게 하여 Buffers 항목을 비교하여야 한다. 마찬가지로 누적 값이다. | |
0Mem | PGA를 사용하는 작업(Sort Merge Join, Hash Join 등)이 메모리에서 모두 처리(OPTIMAL PASS) 되었을 때, 예상되는 PGA 사용량 |
1Mem | PGA를 사용하는 작업이 PGA 메모리에서 한번에 처리되지 못하고, 디스크를 한번 사용(ONE PASS)했을 때, 예상되는 PGA 사용량 |
Used-Mem | PGA를 사용하는 작업에서 실제 사용된 PGA 사용량. OPTIMAL PASS이면 (0), ONE PASS이면 (1), MULTI PASS이면 (2)가 표시 |
항목 | 설명 |
E-Time | 작업 별 예상 실행 시간. 누적값 |
Cost | 작업 별 비용. 비용이 높을수록 성능을 저하시키는 작업일 가능성이 높음 |
Writes
|
ONE PASS 이상으로 문장이 실행되어 디스크에 기록하는 블록수 |
WITH이 MATERIALIZE로 동작하는 경우에도 나타남 | |
Used-Tmp | ONE PASS 이상으로 SQL이 실행 될 때 나타남 |
Pstart
|
파티션 테이블을 스캔할 때 나타나며, 스캔이 시작되는 파티션 번호가 표시 |
ADVANCED 또는 PARTITION 옵션을 사용해야 나타남 | |
Pstop | 파티션 테이블을 스캔할 때 나타나며, 스캔이 종료되는 파티션 번호가 표시 |
TQ | PARALLEL로 SQL을 실행했을 때 나타남. ADVANCED 옵션을 사용해야 표시 |
IN-OUT | PARALLEL로 SQL을 실행했을 때 나타남. PARALLEL 처리 방식이 표시 |
Distrib | PARALLEL 처리 분배 방식이 표시 |
DBMS_XPLAN.DISPLAY_CURSOR 사용법
select * from table(dbms_xplan.display_cursor(null,null,'TYPICAL ALLSTATS LAST'));
첫번째 인자 : SQL ID or Null
null : 방금 전에 수행 했던 SQL을 따라감
두번째 인자 : PLAN HASH VALUE 값 or Null
동일한 SQL ID 에 다른 PLAN HASH VALUE 값을 가지고 있을 경우 확인
세번째 인자
DBMS_XPLAN.DISPLAY_CURSOR 함수의 세번째 인자에 지정 가능한 항목은 다음과 같음
항목 | 설명 | |
BASIC | 작업명과 해당 옵션만 표시 | |
TYPICAL | 파티션과 PARALLEL 사용과 같은 다양한 정보를 표시. 디폴트 | |
SERIAL | TYPICAL과 같지만, PARALLEL 정보는 제외 | |
ALL | 표시 가능한 정보는 모두 표시 | |
ADVANCED | ALL과 OUTLINE 및 바인드 변수 정보를 표시 | |
ALLSTATS | IOSTATS LAST와 동일 | |
MEMSTATS | 해시 조인, 정렬 등과 같은 메모리 사용 작업에 대한 정보를 표시 | |
IOSTATS | 커서 실행에 대한 I/O 통계 표시 | |
LAST | 최근에 실행된 커서에 대한 통계를 표시 | |
OUTLINE | OUTLINE 정보와 힌트를 표시 | |
ALIAS | 쿼리 블럭명 및 객체의 별칭을 표시 | |
PREDICATE | PREDICATE를 표시 | |
PEEKED_BINDS | 바인드 변수 값을 표시 | |
PARALLEL | 병렬 실행 정보를 표시 | |
PARTITION | 파티션 프루닝 정보를 표시 | |
BYTES | 계산된 바이트 수를 표시 | |
COST | 옵티마이저에 의해 계산된 비용 |
'Oracle > 튜닝' 카테고리의 다른 글
B-Tree 인덱스 구조 (0) | 2022.02.10 |
---|---|
FULL TABLE SCAN (0) | 2022.02.10 |
실행계획 순서분석 (0) | 2022.01.28 |
CBO, 테이블 통계, 인덱스 통계 (0) | 2022.01.28 |
SQL Tuning (0) | 2022.01.27 |