DB에 대한 데이터 분석가의 에티켓 별점 5.5억 개, 유저당 월평균 시청 시간 24시간 이상 등, 왓챠피디아 & 왓챠의 DB에는 방대한 데이터가 있으며, 서비스의 성장과 함께 날이 갈수록 더 많은 양의 데이터가 쌓이고 있습니다. 그러다 보니 때때로 DB에 쿼리를 날릴 때에는 쿼리의 최적화 여부에 따라 성능이 눈에 띄게 변하는 것을 자주 느낍니다. 그래서 이번 글에서는 SQL을 최적화할 수 있는 7가지 방법에 대해 정리하려고 합니다. 물론, 소개할 7가지 방법 외에도 다양한 최적화 방법이 있을 것입니다. 하지만
SQL 별로 사용하고 있는 Query Planner의 로직이 조금씩 다르고, 쿼리가 참조할 테이블의 크기와 구성 또한 다양할 것이기 때문에, 본 글에서는 가장 일반적으로 적용될 수 있는 방법을 소개할 예정입니다. 일부 방법에는 예시 데이터를 활용하여 Inefficient 쿼리와 Improved 쿼리 간에 성능 차이가 실제로 얼마나 나는지 비교하는 자료를 포함하였습니다. 예시 데이터로 활용될 테이블과 필드는 아래와 같으며, 이들은 왓챠의 데이터와는 무관한, 실험을 목적으로 임의로 만들어낸 데이터셋임을 미리 밝힙니다. # movie (약 100개의 레코드) 들어가기 전에
1. SELECT 시에는 꼭 필요한 칼럼만 불러와야 합니다. -- Inefficient
2. 조건 부여 시, 가급적이면 기존 DB값에 별도의 연산을 걸지 않는 것이 좋습니다. -- Inefficient
3. LIKE사용 시 와일드카드 문자열(%)을 String 앞부분에는 배치하지 않는 것이 좋습니다.
-- Inefficient 4. SELECT DISTINCT, UNION DISTINCT와 같이 중복 값을 제거하는 연산은 최대한 사용하지 않아야 합니다.
-- Inefficient 5. 같은 내용의 조건이라면, GROUP BY 연산 시에는 가급적 HAVING보다는 WHERE 절을 사용하는 것이 좋습니다.
-- Inefficient 6. 3개 이상의 테이블을 INNER JOIN 할 때는, 크기가 가장 큰 테이블을 FROM 절에 배치하고, INNER JOIN 절에는 남은 테이블을 작은 순서대로 배치하는 것이 좋습니다
-- Query (A)
7. 자주 사용하는 데이터의 형식에 대해서는 미리 전처리된 테이블을 따로 보관/관리하는 것도 좋습니다.
정리
|