< 3주차 SQL 쿼리 문법을 활용하여 데이터 분석을 진행하기 (4) >
6. 효율적인 SQL 코드 작성하기
6-1. 테이블을 집합으로 생각하기
- 최대한 작게 만들어 놓고 JOIN 하기
: 최대한 먼저 필터링을 해서 집합 크기를 줄여준 뒤, 다른 테이블과 JOIN 하는 것이 좋음
선 필터링 후 JOIN VS 선 JOIN 후 필터링
==> 시간이 훨씬 짧음!
6-2. *, % 사용 지양하기
새로운 테이블을 접했을 때..
- LIMIT 걸고 조회하기
: 행수가 매우 큰 테이블을 확인할 수도 있기 때문에, 항상 LIMIT을 거는 것이 좋음
SELECT product_id, name
FROM products
LIMIT 10
- 파티션이 있는 테이블인지 확인하고, 파티션을 필터 조건으로 걸고 조회하기
ex. 유저 행동 데이터가 저장되어 있는 경우, 하루 혹은 시간단위로 파티션을 나눔.
-> 이를 테이블을 파티션없이 조회하면, 쿼리폭탄이 되기 때문에 파티션을 필수 조건으로 걸고 조회하기!
SELECT clk_index, user_name, product_id
FROM clicks
WHERE date = '20231104'
LIMIT 10
- 컬럼 수가 많은 테이블을 조회할 때 SELECT * 지양하기
: 행 수가 많은 테이블일 때는 알고 싶은 컬럼만 지정하여 확인하기!
- LIKE 사용 시 % 제한적으로 사용하기
: %는 임의의 문자열을 의미함 -> 즉, 임의의 문자열이 몇 개가 와도 괜찮기 떄문에 연산량이 매우 커짐
따라서 규칙을 최대한 좁혀서 사용하는 것이 좋음!
-- 23FW가 첫 글자로 시작한다면, 뒤에만 % 붙이기
SELECT product_id
FROM products
WHERE name LIKE '23FW%'
LIMIT 10
-- 23FW 뒤에 몇 글자가 올지 확실하다면, _ 기호 사용하기
SELECT product_id
FROM products
WHERE name LIKE '23FW__'
LIMIT 10
6-3. 데이터 타입 잘 확인하기
- 비교 연산자를 쓸 때 타입을 확인하기
SQL에서는 묵시적 형 변환을 지원함
: 비교하고자 하는 두 값이 다른 타입일 때, DB가 알아서 타입을 맞춰 비교해줌
ex) date가 string 타입일 때는 문자열과 비교를 해 줘야(date type과 비교 X) 묵시적 형 변환이 일어나지 않음
-> 시간 오래걸림, 쿼리 결과가 원하는 형식이 아닐 때 원인을 찾기 어려워짐
SELECT count(1)
FROM clicks
WHERE date > '20231031'
- WHERE 절에서는 왼쪽 컬럼에 함수 적용 지양하기
상대적으로 작은 테이블의 컬럼에 함수 적용하기!
-- v1
-- 컬럼을 형변환하며 비교함
SELECT count(1)
FROM clicks
WHERE DATE_FORMAT(data, %Y-%m-%d') > '2023-10-31'
-- v2
-- 비교 대상을 형변환하여 비교함
SELECT count(1)
FROM clicks
WHERE date > DATE_FORMAT('2023-10-31', "%Y-%m-%d")
==> 위의 v1과 v2를 비교하면, v2가 훨씬 빨리 끝남
6-4. JOIN 시 유의할 점
JOIN은 연산량이 큼 -> 따라서 고려해야할 점이 많음
- JOIN 하는 테이블 간의 관계를 고려하기
1) 1:1
-> 왼쪽과 오른쪽에 각각 행 하나
ex. 한 명의 직원이 하나의 팀에만 소속되면, 인사정보 테이블과 팀별 소속 테이블은 1:1 관계임
2) 1:n
-> 왼쪽 테이블에 행 하나, 오른쪽 테이블에 행 여러개
ex. 고객 정보에서 클릭 이력 또는 구매 이력의 관계 (고객 한 명이 여러 상품을 클릭하거나 여러 상품을 구매할 수 있음)
3) n:n
-> 왼쪽 테이블에 행 하나가 오른쪽 테이블의 행 여러 개에 대응되고,
오른쪽 테이블의 행 하나가 왼쪽 테이블의 행 여러 개에 대응됨
ex. 대학생과 동아리의 관계. 학생 한 명은 여러개 동아리 가입 가능, 동아리 하나는 여러 명의 학생 보유
- 데이터 중복이 있는지 확인하기
: JOIN 대상의 테이블에 중복을 확인하기
-> 불필요한 결합 때문에 속도 저하 혹은 의도했던 결과가 나오지 않을 수 있음
- 여러 가지 쿼리 방식을 고려하기
: 같은 결과라도 이를 뽑기 위한 쿼리는 다양함
상황에 따라 가장 효율적인 방식을 택하는 것이 중요
6-5. 가독성 높이기
: 다른사람이 짠 쿼리를 제대로 이해하기 위해..
+ 필요한 부분을 쉽게 수정하기 위해
1. 서브쿼리보다는 WITH 구문이 가독성이 좋다.
: 블록으로 구성되어 있기 때문에 이해하기 쉬움
2. WITH 절을 사용할 때, 각 블록 이름을 잘 지정하기.
3. 쿼리가 복잡해지면 중간중간 주석을 작성하기.
🎡 2024년 3월 7일 목요일 TIL
오늘 강의는 부담없이 들은 내용이었다. 내용도 쉽고, 편하게 들은 듯 하다.
'STUDY > DevCourse' 카테고리의 다른 글
[데브코스][데이터 분석] SQL 심화 (SQL과 데이터베이스) (1) | 2024.03.18 |
---|---|
[데브코스][데이터 분석] SQL을 활용한 데이터 분석 (0) | 2024.03.08 |
[데브코스][데이터 분석] 다양한 데이터 타입 다루기 (0) | 2024.03.06 |
[데브코스][데이터 분석] 다양한 SQL 함수 다루기 (0) | 2024.03.06 |
[데브코스][데이터 분석] SQL 여러 테이블 결합하여 사용하기 (0) | 2024.03.05 |