오늘은 데이터베이스 쿼리최적화에 대해서 알아보는 시간을 갖도록 하겠다.
(1) 쿼리 최적화가 필요한 이유
- 쿼리 최적화는 데이터를 빠르게 가져오기 위함이다.
- 비용 감소와 서비스의 질을 높히기 위해서 쿼리 최적화는 필수이다.
어떤 서비스에의 한 페이지를 한 명의 사용자가 보기를 원한다. 이 때 페이지에는 여러 데이터가 담겨 있을 것이고 해당 데이터를 DB에서 빠르게 가져와야만 사용자에게 빠른 서비스를 제공할 수 있다. 하지만 데이터를 가져오는 속도가 느리다면 한 명의 사용자에게 제공되는 서비스의 속도 또한 느려질 것이다. 그러나 이러한 서비스를 한 명의 사용자가 아닌 많은 사람이 이용한다면 문제는 더욱 커지게 된다. 데이터를 가져오기 위해 쿼리를 날리는 행위는 DB 커넥션을 맺은 상태에서 이루어진다. 그러나 DB의 커넥션은 제한되어 있다. 즉 한 번 데이터를 가져올 때 빠르게 가져오고 사용중이던 커넥션을 다른 쪽에서 사용할 수 있도록 빠르게 반환 해야 한다.
(2) 최적화 방법
① SELECT 시 꼭 필요한 칼럼만 불러온다.
- 테이블에서 몇 개의 컬럼만을 조회하는 경우라면, SELECT *을 사용할 필요가 없다. 적기 편할 수 있지만, 쿼리를 완료하기 위해서 더 많은 시간을 필요로 한다. 필요한 일부 컬럼만을 선택함으로써 결과 테이블의 크기를 줄이고 네트워크 트래픽을 감소시킴으로써 쿼리의 평균 속도를 높일 수 있다.
② 조건 부여 시 가급적 기존 DB값에 별도의 연산을 걸지 않는다.
- SQL문을 작성하다 보면 수학 연산을 수행해야할 때가 있다. 수학연산은 매번 열을 찾아서 연산을 다시 하므로, 부적절하게 사용된다면 성능을 상당히 저하시킬 것이다. 따라서 SQL문에서 불필요한 수학 연산을 제거하는 것은 속도를 빠르게 할 것이다.
③ Like 사용 시 와일드카드 문자열(%)을 String 앞부분에는 배치하지 않는다.
- 와일드카드 문자열(%)을 String 앞부분에 배치하면 Index를 활용할 수 없어 Full Table Scan을 활용한다.
- 따라서, 같은 결과를 낼 수 있다면 다른 형태의 조건을 적용하는 것이 바람직하다.
④ SELECT DISTINCT, UNION DISTINCT와 같이 중복 값을 제거하는 연산은 최대한 사용하지 않는다.
- DISTINCT를 사용하면 정렬하는 과정이 들어가기 때문에 쿼리의 속도가 상당히 저하된다.
- 대체 방법으로는 EXISTS를 활용하는 방법이 있다.
⑤ 같은 조건이라면 GROUP BY 연산 시에는 가급적 HAVING보다 WHERE절을 사용하는게 좋다.
- 쿼리 실행 순서에서, WHERE 절이 HAVING절보다 먼저 실행된다.
- 따라서 WHERE절로 미리 데이터 크기를 작게 만들면, GROUP BY에서 다뤄야 하는 데이터 크기가 작아지기 떄문에 효율적인 연산이 가능
⑥ 3개 이상의 테이블을 INNER JOIN할 때는 크기가 가장 큰 테이블을 FROM절에 배치하고, INNER JOIN절에는 남은 테이블을 작은 순서대로 배치하는게 좋다.
References
쿼리 최적화
옵티마이저를 통한 쿼리 최적화
velog.io
[Database] 쿼리 Query 최적화 및 튜닝 기술
이 내용은 아래의 정보에 해당하는 논문을 요약한 것입니다. 논문 제목: Query Optimization Techniques - Tips For Writing Efficient And Faster SQL Queries 저자 : Jean HABIMANA 출판된 저널/컨퍼런스명: I..
mangkyu.tistory.com
'컴퓨터 이론 > 데이터베이스' 카테고리의 다른 글
[Database] In-Memory DB(인메모리 디비)에 대해서 알아보자. (0) | 2021.10.14 |
---|---|
[Database] Transaction과 ACID에 대해서 알아보자. (0) | 2021.10.12 |