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;
댓글 없음:
댓글 쓰기