코딩하는 문과생
[SQL] 인덱스만 잘타도 조회속도가 빨라진다. 본문
오라클을 깊게 공부하게 되면서, 그리고 대용량 데이터를 다루며 깨달은 점은
"인덱스"만 잘 타도 조회속도에 엄청난 효율을 가져올 수 있다는 것이다.
1. WHERE 절 내에 스캔할 범위를 줄여줄 칼럼이 있다면 적극적으로 사용하는 것이 좋다.
ex. 대학교를 예로 들면 univ = "KNU" 라는 조건을 통해 스캔할 양을 줄일 수 있다.
2. 옵티마이저는 조건의 우선순위를 between보다는 =를 우선으로 생각한다. 따라서 여기서 파생되어 주의해야 할 점은 인덱스를 태우고 싶다면 "=" 조건을 통해 옵티마이저가 인덱스를 고려하도록 설정할 수 있다.
3. 인덱스가 사용되지 않는 경우
"해당 부분을 잘 이용하면 Cost를 엄청 줄일 수 있다."
3-1. 칼럼에 substr()과 같은 함수나 || 처럼 필터가 사용되면 즉, 칼럼에 변형이 일어나면 해당 칼럼은 인덱스를 타지 않게 된다. 이를 통해 프로그래머는 인덱스를 강제로 타게할 수도, 타지 않게 하면서 튜닝을 할 수 있다.
3-2. 부정형(Not, <, >)으로 조건을 기술한 경우에도 인덱스를 타지 않는다. 이는 NOT EXIST를 이용해 해결할 수도 있다.
3-3. 데이터에 NULL값이 있어도 인덱스를 타지 않는다. 단 결합인덱스의 첫번째 칼럼이 아니라면 NULL로 비교하는 경우도 인덱스를 사용할 수 있다.
4. Hint를 통해 옵티마이저에게 쿼리 수행을 프로그래머가 원하는 방법으로 수행하도록 할 수 있다. 인덱스 부여, 조인방법이나 순서를 설정함으로서 디스크 I/O나 CPU I/O를 효과적으로 낮출 수 있다.
ex. /*+ INDEX(PK_TABLE1) */
5. 내장 함수나 사용자 정의 함수는 가급적 마지막에 사용하는 것이 좋다. 서브쿼리, 서브쿼리 내에 사용하게 되면 시스템에 과부하를 줄 수 있다. 특히 페이징 함수 Count Over는 사용될 때마다 메모리에 적재되므로 출력되기 전 마지막에 사용되는 것이 좋다.
6. 결합 인덱스 설정 기준은 항상 사용되는 지, 항상 "="로 사용되는 지, 분포도가 좋은 지, 자주 사용되는 지를 고려하며 생성하면 된다.
'프로그래밍 > SQL' 카테고리의 다른 글
[SQL] 데이터 모델링 (0) | 2020.11.22 |
---|---|
[SQL] DB 백업과 아카이브 모드 (0) | 2020.06.23 |
[SQL] 조건이 날짜인 경우, 조회속도 올리는 법 (2) | 2020.06.20 |
[SQL] Oracle, Oracle 튜닝, 인덱스 (0) | 2020.04.12 |
[SQL] Oracle, Oracle 튜닝, 오라클 메모리 구조 (0) | 2020.04.12 |