DB

쿼리 최적화를 위해 시도할 수 있는 방법들

가을맛 2021. 9. 29. 18:36

디스크 I/O 줄이기

데이터베이스에서 데이터를 읽는 시간의 대부분은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 비롯된다.

때문에 데이터베이스 쿼리 튜닝은 I/O를 줄이는 것이 주 목적이 된다.

 


 I/O를 줄이기 위해 개발자가 할 수 있는 일들은 다양하다. 

  1. 가능하다면 clusterd 인덱스를 사용한다.
    • clusterd 인덱스는 정렬의 대안으로 사용 될 수 있다. 
    • 단, unclusterd 인덱스는 경우에 따라 정렬보다 코스트 비쌀 수 있으므로 사용시 유의해야한다.
  2. 정렬을 포함하는 쿼리 사용을 지양하기
    • distinct를 사용하는 경우, 쿼리 실행시마다 정렬이 수행되기 때문에 성능이 매우 저하된다. 
    • 그 외에도 많은 쿼리들(group by, union 등)이 수행과정에서 정렬을 포함한다.
  3. 서브쿼리를 조인으로 바꾸기
    • 서브 쿼리로 작성하면 최종 결과 테이블을 얻을 때까지 매번 서브 쿼리가 실행되어야하므로 매우 심한 성능 저하가 발생한다. 
  4. 가능하면 Join은 가장 마지막으로 미룬다.
    • 즉 , select , projection를 사용하여 join하는 두 테이블의 크기를 최대한 작게 만든 후 조인을 진행한다. 
    • join하는 두 테이블의 크기가 작을 수록 I/O코스트가 적게 발생하기 때문
  5. 쿼리 플랜을 계산해보기
    • 쿼리플랜이란? 
      • SQL을 처리하는 최저비용의 경로를 생성해주는 DBMS 내부 핵심엔진인 쿼리 옵티마이저가 쿼리를 수행할 때 생성한 최적의 처리경로
      • 쿼리 옵티마이저는 불완전하기 때문에 더 나은 성능을 얻기 위해 옵티마이저가 만들어내는 플랜을 수동으로 검사하고 튜닝해줘야 한다.
    • 여러 RDBMS에서 쿼리플랜을 보여주는 기능을 제공한다. 
      • MySQL의 경우 실행할 쿼리문 앞에 'EXPLAN' 키워드를 이용해 실행계획에 대한 정보를 살펴 볼 수 있다.