로직과의 사투/DB

쿼리튜닝 겉핥기 - 개요, 옵티마이저

회사에서 쿼리를 짜다보면서 쿼리의 성능이 떨어지는 걸 자주 경험하게 되었다. 그로 인해 자연스럽게 쿼리 튜닝에 대한 고민을 시작했고 조금씩이라도 쿼리 튜닝을 공부하기 시작했다. 그러나 쿼리 튜닝에 대해 계속 알아볼때마다 너무 깊고 무궁무진함을 느꼈고 이렇게 블로그에 글 몇 자로라도 정리의 필요성을 느껴 정리를 시작하게 되었다.

개인적인 공부를 위한 글이다보니 틀린 부분, 잘못 알고있는 부분이 있을 것이라 사료됩니다. 혹시나 이 글을 보시는 분들이 있으시다면 편하게 지적해주시면 감사하겠습니다.

1. 옵티마이저란?

쿼리 튜닝에 대해 알기 전에 먼저 선행 지식으로 갖춰야할 것 중 하나가 옵티마이저이다. 옵티마이저란 DBMS의 내부 엔진으로 SQL을 가장 효율적인 최적의 실행 방법을 결정하는 역할을 수행한다. 사용자가 SQL을 작성 후 실행할 때 옵티마이저는 SQL을 어떻게 실행할 것인지 계획하게 된다. 여기서 동일한 결과가 나오는 SQL도 어떻게 실행하느냐에 따라 성능이 천차만별이기 때문에 SQL 성능에 옵티마이저는 매우 중요한 역할을 한다.

2. 옵티마이저의 동작 원리 및 순서

간단하게 SQL 실행 순서를 보자면, 먼저 사용자가 SQL을 질의하면 SQL 파서를 통해 SQL문 파싱을 진행해 파싱 트리를 만든다. 옵티마이저는 파싱된 SQL을 DBMS 내부 데이터 딕셔너리를 참조해 예상되는 비용을 산정한다. 이후 비용이 가장 낮은 실행 계획을 선택해 실제 SQL을 실행시키고 사용자에게 결과를 반환한다. 물론 내부적으로 더욱 복잡하고 다양한 과정이 있다.

3. 옵티마이저를 알아야 하는 이유

DBMS의 옵티마이저는 최적의 검색을 위해 철저하게 계획을 검사한다. 특히 JOIN 쿼리의 경우 참조되는 테이블의 수에 따라 검사하는 실행계획이 기하급수적으로 증가할 경우가 있어 병목 현상의 주요 원인이 된다. 그렇기 때문에 사용자가 원하는 실행계획을 제시해 줄 수 있다. 그러나, 옵티마이저가 일부 계획을 건너뛸 수 있으므로 최적의 계획을 찾지 못할 수 있어 주의 깊게 사용해야 한다.

글 정리 출처

http://www.gurubee.net/lecture/2400

https://velog.io/@yewon-july/Optimizer