oracle 쿼리 플랜 확인하는 법 oracle 쿼리 플랜 확인하는 법은 set autotrace on traceonly 를 실행한 후, 쿼리를 실행하면 됩니다. 아래와 같이 실행 예시를 보여드립니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 SQL> set autotrace on SQL> select * from scott.emp where empno=7900; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- 7900 JAMES CLERK 7698 03-DEC-81 950 30 Execution Plan ---------------------------------------------------------- Plan hash value: 2949544139 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 38 | 1 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 38 | 1 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("EMPNO"=7900) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 2 consistent gets 0 physical reads 0 redo size 889 bytes sent via SQL*Net to client 512 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed
sql developer에서도 마찬가지로 위와 같은 명령어를 작성하면 되는데요, 실행 시에는 F5(스크립트 실행)키를 눌러 실행계획을 확인해주시면 됩니다.
autotrace 옵션에 따른 출력정보 autotrace 옵션을 traceonly로 설정하고 실행계획을 확인하라고 앞서 말씀드렸습니다. traceonly 외에도 다양한 옵션을 설정할 수 있는데요, 각 옵션들을 비교한 내용은 아래와 같습니다.
옵션 별 명령어 SQL수행 실행결과 실행계획 통계정보 비고 set autotrace on o o o o SQL을 실제 수행하고 그 결과와 함께 실행계획 및 실행통계를 출력 set autotrace on explain o o o x SQL을 실제 수행하고 그 결과와 함께 실행계획을 출력 set autotrace on statistics o o x o SQL을 실제 수행하고 그 결과와 함께 실행통계를 출력 set autotrace on traceonly o x o o SQL을 실제 수행은 하지만 그 결과는 출력하지 않고 실행계획과 실행통계만 출력 set autotrace traceonly explain x(dml은o) x o x SQL을 실제 수행하지 않고 실행계획만 출력 set autotrace traceonly statistics o x x o SQL을 실제 수행은 하지만 그 결과는 출력하지 않고 실행통계만 출력
오라클 쿼리 실행 계획 보는법, 오라클 실행계획 해석 아래 plan hash value는 실행계획을 식별하는 고유한 값입니다.
1 Plan hash value: 2949544139
아래가 본격적인 실행계획인데요, 읽는 순서는 아래와 같습니다.
위에서 아래로 읽어 내려가면서 depth 가 가장 깊고(들여쓰기), 그 중 ID가 작은값 부터 읽는다. 같은 들여쓰기가 존재하면, 위에서 아래 순으로 읽는다. 들여쓰기가 된 항목을 다 확인하면 상위 depth를 읽는다. 이 원칙대로면, 아래 플랜을 읽는 순서는 3 → 4 → 2 → 5 → 1 → 0 와 같습니다.
1 2 3 4 5 6 7 8 9 10 --------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1638| 17 (0)| 00:00:01 | | 1 | NESTED LOOPS | EMP | 1 | | 0 (0)| 00:00:01 | | 2 | NESTED LOOPS | | 14 | 1638| 17 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL | EMP | 14 | 1218| 3 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 0 (0)| 00:00:01 | | 5 | TABLE ACCESS BY INDEX ROWID | DEPT | 1 | 30| 1 (0)| 00:00:01 | ---------------------------------------------------------------------------------------------
위 표에서 각 항목에 대한 설명은 아래와 같습니다.
Operation : 수행하는 명령입니다. Name : 액세스하는 객체 명입니다. 4번같은경우는 PK_EMP란 key에 접근한다는 뜻이고, 3번같은경우는 EMP라는 테이블에 접근한다는 뜻입니다. Rows : Cardinality라고 표현하기도 하며, 해당 실행단계에서 access된 row 수 입니다. 낮을수록 빠릅니다. Bytes : 해당 실행계획 단계에서 access된 byte 수 입니다. 낮을수록 빠릅니다. Cost : 쿼리를 수행하는데 사용하는데 필요한 비용입니다. oracle 자체적으로 예상한 cost 수치입니다. 낮을 수록 빠릅니다. Time : 수행하는 시간입니다. 다음으로는 Statistics에 대한 설명입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Statistics ---------------------------------------------------------- 262 recursive calls ==> SQL문을 실행하기 위해 syntax, semantics, previlge 등 체크하는데 필요한 명령어들을 recursve sql 이라고 합니다. 표현되는 숫자는 읽혀진 data block의 숫자 0 db block gets ==> datablock(변경 전 데이터)가 저장된 공간 726 consistent get ==> 변경 후 데이터가 저장된 공간. DBBlock과 Consistent 공간은 메모리 상의 공간. 보통은 메모리 read가 물리적 read보다 많으나, 물리적 read가 많아질 경우 성능 문제가 발생할 수 있습니다. 0 physical read ==> 디스크상에서 읽어서 메모리에 로드된 블록 수 입니다. 0 redo size ==> redo log buffer에서 읽은 사이즈 입니다. 983 bytes sent via SQL*Net to client ==> 서버에서 클라이언트로 보내준 byte 수입니다. 396 bytes received via SQL*Net from client ==> 클라이언트에서 서버로 넘겨준 byte 수 입니다. 3 SQL*Net roundtrips to/from client ==> 서버와 클라이언트 간 통신을 한 횟수입니다. 9 sorts (memory) ==> 메모리 상에서 sort하는데 필요한 양 0 sorts (disk) ==> 디스크 상에서 sort하는데 필요한 양 20 rows processed ==> 쿼리 실행 결과 fetch되는 Row 수