2016년 8월 25일 목요일

07day SQL tunning

--화면에 메시지 없앰
SQL> set echo off

--모든 컬럼에 index걸어줄 경우
SELECT 속도는 빨라지지만
DML속도는 느려짐;

--모델링 : SQL문 튜닝하기전에 속도를 빠르게 하기위해서는 데이터를 정규화 해야함
--INDEX로 사용하면 좋은 컬럼

  • UNIQUE
  • 자주 WHERE 조건 사용
  • JOIN 조건에 자주 사용
  • 범위를 두고 찾는 컬럼
  • 정렬 순서로 자주 사용되는 컬럼 
    • 인덱스 컬럼 사용하면 정렬을 안해도 정렬되어서 나옴
    • 그러나 정렬을 목적으로 인덱스 컬럼을 설정하면 DML성능이 떨어지는 것 고려해야함
  • NULL 이 많은 컬럼
    • 널값은 인덱스 테이블에 들어가지 않음으로 널이 아닌값을 찾을때 빠름
    • 조건절에 널값이라는 조건이 있어도 인덱스를 참조할 수 없음
  • 분포도가 고른 컬럼
    • 분포가 고르지 않고 한쪽에 쏠려있으면 인덱스 안보고 그냥 검사하는게 빠름
    • 분포가 많은 부분은 NULL값으로 적으면 분포가 적은VALUE만 인덱스를 구성하므로 빨라짐


--인덱스를 걸면 정렬 순서가 달라짐
SQL> SELECT EMPNO, ENAME, SAL
  2  FROM EMP
  3  WHERE SAL>=2000;
--인덱스 생성
SQL> CREATE INDEX IDX_EMP_SAL
  2  ON EMP(SAL);
--인덱스걸린 컬럼 검색
SQL> SELECT EMPNO, ENAME, SAL
  2  FROM EMP
  3  WHERE SAL>=2000;
**인덱스가 내부구조상 정렬이 되어있기 때문에 정렬하지 않아도 정렬되어 나옴

--인덱스가 정렬되어있기 때문에 가장 적은 월급을 받는 사원을 묻는 쿼리를 이렇게 만들 수있음
SQL> SELECT EMPNO,ENAME,SAL
  2  FROM EMP
  3  WHERE SAL>=2000
  4  AND ROWNUM=1;
**COUNT STOPKEY 내부구조는
while(count<=1){
count++;
}
** ROWNUM을 사용하면 STOPKEY를 통해서 테이블을 읽는 행위를 중단할 수 있으므로 빠름  따라서 ROWNUM은 작거나 같다에만 사용가능함
** ROWNUM 명령문은 데이터베이스 종속적임 오라클에서 사용가능함 , MYSQL에서는 LIMIT써야함


--ROWNUM 활용해서 3~5까지를 출력하고 싶다면 내부쿼리를 사용함
SQL> SELECT *
  2  FROM (SELECT ROWNUM RN, EMPNO, ENAME, SAL
  3     FROM EMP
  4     WHERE ROWNUM <=5)
  5  WHERE RN >=3;


댓글 없음:

댓글 쓰기