코딩하는 문과생

[SQL] 인덱스만 잘타도 조회속도가 빨라진다. 본문

프로그래밍/SQL

[SQL] 인덱스만 잘타도 조회속도가 빨라진다.

코딩하는 문과생 2020. 6. 20. 21:01

오라클을 깊게 공부하게 되면서, 그리고 대용량 데이터를 다루며 깨달은 점은

"인덱스"만 잘 타도 조회속도에 엄청난 효율을 가져올 수 있다는 것이다.

 

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. 결합 인덱스 설정 기준은 항상 사용되는 지, 항상 "="로 사용되는 지, 분포도가 좋은 지, 자주 사용되는 지를 고려하며 생성하면 된다.