susinlee 님의 블로그
쿼리 작성 가이드 및 최적화 본문
쿼리 작성 가이드
- 현재 보고 싶은 지표는 무엇인가?, 이쿼리를 작성하는 목표는 무엇인가?
- 해당 지표는 어덯게 계산해야 할까? 데이터의 기간은 어떻게 될까
- 해당 지표를 계산하기 위해 어떤 테이블을 확인해야 할까? Join 활용할 Key는 무엇인가?
- 하나의 테이블에서 원하는 정보를 모두 추출할 수 있을까? 혹은 여러 테이블을 사용해야 할까
- 데이터를 파악할 때 주의해야 하는 내용은?
- 위 내용을 주석으로 설정한 후 쿼리 작성하는 습관 가지기
회사에서 쿼리 작성하는 흐름
- 쿼리 체크 리스트를 작성한다.
- 보고 싶은 지표를 구체화한다
- 사내에 이미 해당 지표를 구하는 쿼리가 있는지 찾아본다. 있으면 바로 쿼리를 실행하고 쿼리를 분석해보자
- 보고 싶은 지표가 있는 데이터가 있는 테이블 찾기
- 하나의 테이블에서 모든 데이터가 나올 것 같은 경우 - 바로 쿼리를 짠다
- 여러 테이블에서 데이터를 연결해야 할 것 같은 경우 - 어떻게 연결할지 고민한다
- 구한 결과값이 정말 맞는지 확인한다(데이터 정합성 체크) - 원본 데이터를 하나씩 비교해보는 방법도 있고 다양한 방법이 존재한다
- 쿼리를 더 효율적으로 만들 방법을 고민한다(+ 가독성)
쿼리 최적화 (아마존, 빅쿼리)
1. ORDER BY 최적화
2. JOIN 최적화
두 테이블을 Join할 때 왼쪽에 큰 테이블을 지정하고 오른쪽에 작은 테이블을 지정
3. GROUP BY 최적화
- 카디널리티가 높은 컬럼을 우선적으로 정렬
- 분산이 균등한 컬럼을 먼저 배치하면 병렬 처리가 최적화
- 숫자 데이터를 사용하여 연산 최적화
- 문자열보다 숫자가 비교 연산 속도가 빠르고 메모리 사용이 적음
- SELECT 절에서 불필요한 컬럼 제외
- GROUP BY 수행시 필요한 컬럼만 선택하면 메모리 사용량이 줄어듦
4. LIKE 최적화
문자열 열에서 여러 값을 필터링할 때는 일반적으로 LIKE 보다 여러 번 정규표현식을 사용하는 것이 좋다.
5. 근사 함수 사용
6. SELECT * 사용 자제
- 데이터 미리보기 사용
- SELECT * 쿼리에 LIMIT 절을 적용해도 쿼리가 읽는 데이터 양은 달라지지 않음. 하나 이상의 열을 결과에서 제외하려면 SELECT * EXCEPT 컬럼명 을 사용.
7. JOIN 전 데이터 줄이기
최적의 쿼리를 작성하려면 필요한 데이터만 먼저 필터링하고, 이후에 조인하는 방식이 일반적으로 가장 성능이 좋다
8. WHERE 절 사용
쿼리가 반환하는 데이터 양을 제한하려면 WHERE 절 사용
STRING 또는 BYTE 보다 BOOL, INT, FLOAT, DATE 타입이 더 빠르다.
가능한 경우 이러한 데이터 유형 중 하나를 가지는 열을 사용하여 쿼리에서 반환되는 데이터 양을 줄이자
'코드카타 > SQL, Pandas' 카테고리의 다른 글
문자열 관련 함수, 최적화 및 안정성 (0) | 2025.04.02 |
---|---|
코호트와 리텐션의 구현 (MySQL, Pandas) (0) | 2025.03.31 |
SQL로 조합 생성하기 (0) | 2025.03.18 |
퍼널 분석 - SQL 쿼리로 구현하기 (0) | 2025.03.16 |
코호트 분석 - SQL 쿼리로 구현하기 (0) | 2025.03.16 |