EXPLAIN PLAN
https://coding-factory.tistory.com/745
-
SQL DEVELOPER 프로그램 사용
사용할 SQL에서 F10키를 누르면 확인가능
-
EXPLAIN PLAN
아래와 같은 형태로 쿼리를 실행한다
EXPLAIN PLAN FOR
SELECT *
FROM EMP
WHERE EMPNO = '200101'
쿼리실행후 실행계획 확인하기
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
- 실행계획 항목의미
- Id : 실행계획의 오퍼레이션ID
- Operation : 해당단계에 수행한 작업 내용
- Name : 해당단계에 작업을 수행한 대상 오브젝트(테이블 or 인덱스)
- Rows : 해당 단계 수행 시 조회될 예상 데이터 건수
- Bytes : 해당 단계까지 사용될 예상 데이터 양(누적)
- Cost : 해당 단계까지 사용될 예상 비용(누적)
- Time : 해당 단계까지 사용될 예상 시간(누적)
- 실행계획 순서
- 부모자식 중에는 자식이우선
- 형제간에는 형이 우선.
- 세션 유지하는동안 수행된 SQL에 대한 실행계획보기
- ALTER SESSION SET STATISTICS_LEVEL = ALL;
- 실제 실행계획 확인하기 (GATHER_PLAN_STATISTICS)
- SELECT 권한이 필요한 VIEW
- V_$SQL
- V_$SQL_PLAN_STATISTICS_ALL
- V_$SQL_PLAN
- V_$SESSION
- 실제 실행계획 만들기
SELECT /+ GATHER_PLAN_STATISTICS /
**
FROM TABLE
WHERE 조건들 살라살라
- 실제 실행계획을 만든 SQL의 SQL_ID찾기
SELECT T1.SQL_ID, T1.CHILD_NUMBER, T1.SQL_TEXT
FROM V$SQL T1
WHERE T1.SQL_TEXT LIKE '%GATHER_PLAN_STATISTICS%'
ORDER BY T1.LAST_ACTIVE_TIME DESC;
- 실제 실행계획 조회하기
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('SQL_ID', 0 ,'ALLSTATS LAST'));
마지막실행쿼리를 조회하려면 인자를 NULL, NULL, 'ALLSTATS LAST'
- 포멧별 조회방법
예측치 빼고조회 : SELECT FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('SQL_ID', 0 ,'ALLSTATS LAST -ROWS'));
추가 힌트,쿼리블록정보 포함 :
SELECT FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('SQL_ID', 0 ,'ALLSTATS LAST +OUTLINE +ALIAS'));
- 실제 실행계획 조회 결과항목
- ID : 실행계획의 OPERATIONI
- OPERATION : 해당단계에 수행한 작업내용
- Name : 해당 단계에 작업을 수행한 대상 오브젝트(테이블 또는 인덱스)
- Starts : 해당단계를 수행한 횟수
- E-Rows : 해당단계 예상 데이터 건수
- A-Rows : 해당단계의 실제 데이터 건수
- A-Time : 해당 단계까지 수행된 실제 시간(누적)
(A-Time은 복잡한 실행계획이나 병렬쿼리에서는 부정확한경우도있다)
- Buffers : 해당 단계까지 메모리 버퍼에서 읽은 불록수(논리적IO횟수, 누적)
- Read : 해당단계까지 디스크에서 읽은 블록수(물리적IO횟수, 누적)
- 0Mem, 1Mem, Used-Mem:SQL 처리를 위해 사용한 메모리 수치
- A-Rows, A-Time, Buffers, Read를 주의 깊게 보고
수치가 높아진단계가 있다면 해당부분의 원인을 찾아 성능개선을 하면 된다.