mysql의 plan 를 떴다.

mytop에서 뜰 수 있고, mysql 내부에서 뜰 수 있다.

이에 대한 설명은 다음과 같다.

 

출처 : blog.empas.com/ing1560/read.html?a=26448819

 

 - table : 테이블 명
- type : 조인의 타입
    system : 테이블이 하나의 레코드만 가지는 경우
    const : 테이블에 조건을 만족하는 레코드가 하나일 때, 상수 취급
    eq_ref : 인덱스가 UNIQUE이거나 PRIMARY KEY인 경우의 조인으로 const를 제외한 조인 중 가장 좋은 형태
    ref : eq_ref와 다른 점은 UNIQUE가 아닐 경우 사용한다는 것.
    range : 조건에 레코드의 범위가 주어진 조인.
    index : all 형태와 비슷하며, 인덱스를 사용한다.
    all : 모든 레코드를 스캔한다.
- possible_keys : 테이블에서 사용 할 수 있는 키(인덱스)
- key : possible_keys에 나온 키 중에서 실제로 사용한 키
- key_len : 키의 길이
- ref : 인덱스를 사용할 때 어떤 컬럼과 조건이 맞아야 하는지
- rows : 조건을 만족하는 레코드를 찾기 위해 몇개의 레코드를 검사해야 하는지
- Extra : 부가적인 정보
    distinct : 조건을 만족하는 레코드를 찾았을 때 같은 조건을 만족하는 또 다른 레코드가 있는지 검사하지 않음.
    not exist : left join 조건을 만족하는 하나의 레코드를 찾았을 때 다른 레코드의 조합은 더 이상 검사하지 않는다.
    range checked for each record : 최적의 인덱스가 없는 차선의 인덱스를 사용한다는 의미.
    using filesort : mysql이 정렬을 빠르게 하기 위해 부가적인 일을 한다.
    unsing index : select 할때 인덱스 파일만 사용
    using temporary : 임시 테이블을 사용한다. order by 나 group by 할때 주로 사용
    where used : 조건을 사용한다는 의미.

 

 

 

참고로 오라클에서 plan 정보 뜨기 정보이다.

출처 : http://www.phplab.co.kr/cms/board/bod_view.php?code=dbms&no=26&pageID=2&item=&find=&flg=

 

1. Plan Table 생성

ORACLE_HOME은 C:\ORANT인경우 
 
테이블 PLAN_TABLE을 생성하는 SQL문은
C:\ORANT\RDBMS80\ADMIN 디렉토리의 UTLXPLAN.SQL입니다. 
 
실행을 시키면 아래와 같이 실행되게 됩니다.

<pre>SQL> SHOW USER 사용자는 "SCOTT" 입니다.
SQL> @C:\ORAWIN95\RDBMS80\ADMIN\UTLXPLAN.SQL
테이블이 생성되었습니다.
SQL>


2. DESC PLAN_TABLE
Name                         Type
--------------------- -----
STATEMENT_ID          VARCHAR2(30)  //사용자가 지정한 제목
TIMESTAMP              DATE               //실행계획이 수립된 날짜와 시간
REMARKS                 VARCHAR2(80) //사용자가 부여한 주석(comments)
OPERATION               VARCHAR2(30) //AND-EQUAL, INDEX, SORT등과 같은 실행 연산자
OPTIONS                   VARCHAR2(30) //BY ROWID, JOIN, FULL 등과 같은 실행 옵션
OBJECT_NODE          VARCHAR2(128) //사용한 데이터베이스 링크
OBJECT_OWNER        VARCHAR2(30) //객체를 생성한 소유자
OBJECT_NAME          VARCHAR2(30) //테이블, 인덱스, 클러스터 등의 객체의 이름
OBJECT_INSTANCE    NUMBER(38)   //SQL문의 FROM절에 기술된 객체를 좌에서 우로부여한 번호
OBJECT_TYPE           VARCHAR2(30) //UNIQUE, NON-UNIQUE INDEX 등의 객체의 종류
OPTIMIZER                VARCHAR2(255) //CHOOSE, RULE, FIRST_ROWS 등의 현재 옵티마이저 모드
SEARCH_COLUMNS    NUMBER
ID                              NUMBER(38) //수립된 각 실행단계에 붙여진 일련번호
PARENT_ID                 NUMBER(38) //부모단계의 일련번호
POSITION                   NUMBER(38) //부모아이디를 가지고있는 자식아이디간의 처리순
COST                         NUMBER(38)
CARDINALITY               NUMBER(38)
BYTES                        NUMBER(38)
OTHER_TAG                VARCHAR2(255)
PARTITION_START       VARCHAR2(255)
PARTITION_STOP         VARCHAR2(255)
PARTITION_ID              NUMBER(38)
OTHER                       LONG

 

3. EXPLAIN PLAN 실행
 
EXPLAIN PLAN을 생성하는 Syntax는 아래와 같습니다.
 
   EXPLAIN PLAN [SET statement_id = 'description']
        [into TABLE_NAME]
        FOR sql_statement
 
 
 
위의 구문을 사용한 예를 살펴 보겠습니다.
 
  SQL> EXPLAIN PLAN SET STATEMENT_ID = 'TEMP_1'
  2  INTO PLAN_TABLE FOR
  3  SELECT A.EMPNO, A.ENAME, NVL(A.SAL,0), B.DNAME
  4  FROM   EMP A, DEPT B
  5  WHERE A.EMPNO = 10
  6  AND   A.DEPTNO = B.DEPTNO
  7  /

Explained.

SQL>

 

4. PLAN_TABLE 확인
 
앞에서 실행한 EXPLAIN PLAN에 대한 PLAN_TABLE의 확인은 아래와 같이 합니다.
 
  SQL> SELECT ename, job, sal, dname
             FROM emp, dept
           WHERE emp.deptno = dept.deptno
            AND not exists
              (SELECT *
                  FROM salgrade
               WHERE emp.sal BETWEEN losal AND hisal)

 ID   P_ID OPERATION                 OPTIONS              OBJECT_NAME    
 ---- ---- ---------------------- ------------------ --------------------
  0          SELECT STATEMENT                                              
  1    0       FILTER                                                   
  2    1         NESTED LOOP                                
  3    2           TABLE ACCESS        FULL                EMP           
  4    2           TABLE ACCESS        BY ROWID         DEPT
  5    4             INDEX UNIQUE SCAN                      PK_DEPT

  6    1         TABLE ACCESS        FULL                  SALGRADE

 

실행계획 생성결과를 이진트리로 표현하면

                     1 

              |             |          

             2              6

       |           |  

       3           4

                    | 

                    5

 

1 FILTER : ID 2번에서 ACCESS 한 결과로ID 6번의 결과를 FILTER

2 NESTED LOOPS : ID 3번에서ACCESS한 결과로 ID 4번에서ACCESS한 결과를 NESTEDLOOP JOIN

6 TABLE ACCESS FULL salgrade :salgrade TABLE을 FULL SCAN

3 TABLE ACCESS FULLemp : emp TABLE을FULL SCAN

4 TABLE ACCESS BY ROWID dept :dept TABLE을 pk_dept에서 읽은rowid로 ACCESS

5 INDEX UNIQUE SCAN pk_dept : pk_dept INDEX를UNIQUE SCAN

 

하나의 SQL 문장에 대한 실행계획을 만들어 결과를 분석하였습니다. 그런데,
이렇게 하나 하나의 문장에 대해서 실행계획을 생성하지 않고, 시스템 전체 혹은 하나의
세션에서 발생하는 모든 SQL 문에 대한 실행계획을 알고자 할 경우에는 Trace File을
만들어서 분석합니다.
 
  생성된 trace file은 생성된 그 자체로는 우리가 분석할 수 없어서 분석할 수 있도록 tkprof라는
tool을 사용해서 분석할 수 있습니다. 또한 SQL*PLUS에서 실행계획의 간략한 정보만
볼 수도 있습니다.


 

Posted by 김용환 '김용환'

댓글을 달아 주세요