디스크 I/O 줄이기
데이터베이스에서 데이터를 읽는 시간의 대부분은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 비롯된다.
때문에 데이터베이스 쿼리 튜닝은 I/O를 줄이는 것이 주 목적이 된다.
I/O를 줄이기 위해 개발자가 할 수 있는 일들은 다양하다.
- 가능하다면 clusterd 인덱스를 사용한다.
- clusterd 인덱스는 정렬의 대안으로 사용 될 수 있다.
- 단, unclusterd 인덱스는 경우에 따라 정렬보다 코스트 비쌀 수 있으므로 사용시 유의해야한다.
- 정렬을 포함하는 쿼리 사용을 지양하기
- distinct를 사용하는 경우, 쿼리 실행시마다 정렬이 수행되기 때문에 성능이 매우 저하된다.
- 그 외에도 많은 쿼리들(group by, union 등)이 수행과정에서 정렬을 포함한다.
- 서브쿼리를 조인으로 바꾸기
- 서브 쿼리로 작성하면 최종 결과 테이블을 얻을 때까지 매번 서브 쿼리가 실행되어야하므로 매우 심한 성능 저하가 발생한다.
- 가능하면 Join은 가장 마지막으로 미룬다.
- 즉 , select , projection를 사용하여 join하는 두 테이블의 크기를 최대한 작게 만든 후 조인을 진행한다.
- join하는 두 테이블의 크기가 작을 수록 I/O코스트가 적게 발생하기 때문
- 쿼리 플랜을 계산해보기
- 쿼리플랜이란?
- SQL을 처리하는 최저비용의 경로를 생성해주는 DBMS 내부 핵심엔진인 쿼리 옵티마이저가 쿼리를 수행할 때 생성한 최적의 처리경로
- 쿼리 옵티마이저는 불완전하기 때문에 더 나은 성능을 얻기 위해 옵티마이저가 만들어내는 플랜을 수동으로 검사하고 튜닝해줘야 한다.
- 여러 RDBMS에서 쿼리플랜을 보여주는 기능을 제공한다.
- MySQL의 경우 실행할 쿼리문 앞에 'EXPLAN' 키워드를 이용해 실행계획에 대한 정보를 살펴 볼 수 있다.
- 쿼리플랜이란?
'DB' 카테고리의 다른 글
파일 시스템 VS DBMS - 데이터를 저장할 때 어떤 방식을 선택해야 하는가? (0) | 2021.09.18 |
---|