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에서 실행계획의 간략한 정보만
볼 수도 있습니다.
'DB' 카테고리의 다른 글
mysql 연결시 다음의 에러 발생 : Communications link failure during commit(). Transaction resolution unknown. (0) | 2008.04.04 |
---|---|
mysql에서 delete를 빨리 해보기 (0) | 2008.04.03 |
풀 쿼리 스캔의 악영향 (0) | 2008.04.02 |
mytop mysql 모니터링 툴! (0) | 2008.04.02 |
ORA-00900 에러 와 validationQuery (0) | 2008.03.06 |