티스토리 뷰
정말 기본적인 생각임에도 불구하고, 처음부터 다시 생각해보는 의미로 작성하게 되었다.
SQL에서 JOIN을 사용할 때 ON 조건을 작성하는 방식은 개발자마다 다를 수 있다. 하지만 드라이빙 테이블(Driving Table)을 JOIN 조건의 좌변에 두는 것이 더 좋은지에 대한 고민은 필요하다.
이번 글에서는 드라이빙 테이블의 개념과 JOIN 조건에서 좌변과 우변의 차이를 살펴보고, 어떤 방식이 가독성과 유지보수에 유리한지 정리해 보았다.
1. 드라이빙 테이블이란?
JOIN이 실행될 때, SQL 옵티마이저는 어떤 테이블을 기준으로 다른 테이블과 매칭할지 결정한다. 이때 먼저 처리되는 테이블을 드라이빙 테이블(Driving Table) 이라고 한다.
예제를 살펴보겠다.
SELECT o.order_id, o.order_date, c.customer_name, c.email
FROM orders o
JOIN customers c
ON o.customer_id = c.customer_id
ORDER BY o.order_date DESC;
위 SQL에서 orders 테이블이 드라이빙 테이블이다. 즉, orders 테이블에서 데이터를 먼저 읽고, 이후 customers 테이블과 매칭하는 방식으로 동작한다.
customers 테이블과 매칭하는 방식으로 동작한다.
2. JOIN 시 좌변과 우변의 차이
아래 두 가지 방식의 JOIN을 비교해 보겠다.
방식 1: 드라이빙 테이블을 우변에 둠
ON c.customer_id = o.customer_id
- c.customer_id가 좌변, o.customer_id가 우변이다.
- 옵티마이저가 내부적으로 실행 순서를 정하지만, 가독성이 떨어질 수 있다.
방식 2: 드라이빙 테이블을 좌변에 둠
ON o.customer_id = c.customer_id
- o.customer_id가 좌변, c.customer_id가 우변이다.
- 드라이빙 테이블이 기준이 되어 직관적이고 가독성이 좋다.
SQL 옵티마이저가 실행 순서를 자동으로 최적화하기 때문에 성능 차이는 크지 않다. 하지만 개발자가 코드를 읽을 때 이해하기 쉬운 방식으로 작성하는 것이 중요하다.
3. 드라이빙 테이블을 좌변에 두는 것이 좋은 이유
✅ 가독성 향상
- JOIN을 읽을 때 흐름이 직관적이다.
- 데이터를 먼저 읽는 테이블을 좌변에 두면 이해하기 쉽다.
✅ SQL 스타일 가이드 권장
- 많은 스타일 가이드에서 기준이 되는 테이블을 좌변에 배치하는 것을 권장한다.
- 유지보수 시 가독성이 좋아지고 협업이 쉬워진다.
✅ 실행 계획(EXPLAIN) 확인 필요
- SQL 옵티마이저가 실행 순서를 최적화하므로, 실제 실행 방식은 EXPLAIN으로 확인해야 한다.
- 필요하면 인덱스를 추가하여 최적화할 수 있다.
마무리
결론적으로, 드라이빙 테이블을 JOIN 조건의 좌변에 배치하는 것이 가독성과 유지보수성 측면에서 유리하다.
📌 핵심 정리
- 드라이빙 테이블은 먼저 처리되는 테이블이다.
- JOIN 시 드라이빙 테이블을 좌변에 두면 코드 가독성이 좋아진다.
- SQL 옵티마이저가 실행 순서를 최적화하지만, 가독성을 고려해 좌변 배치를 권장한다.
- EXPLAIN을 활용하여 실행 계획을 확인하는 것이 중요하다.
SQL을 작성할 때 단순히 실행만 고려할 것이 아니라, 협업과 유지보수를 위해 더 읽기 좋은 SQL을 작성하는 방법도 고민해야 한다. 🚀
'ALL' 카테고리의 다른 글
How to backup a postgres database using java / 자바로 postgres DB 백업하기(pg_dump) (0) | 2024.05.14 |
---|---|
[JVM] Class Loader (1) | 2024.01.21 |
깃 소스트리 fatal: bad config line 1 in file C:/Users/.... (0) | 2023.10.17 |
[Conda-Jupyter] 맥 Conda 가상환경 과 Jupyter Kernel (2) | 2023.10.04 |
Null, NPE 방어에 대해서 (0) | 2023.07.24 |
- Total
- Today
- Yesterday
- React
- node
- 데이터베이스
- EC2
- 옵티마이저
- spring
- 스프링 프로젝트
- 자바스크립트
- 남궁성
- JavaScript
- 스프링 빈
- 이정환
- AWS
- 스프링
- 코드로 배우는 스프링 웹 프로젝트
- 친절한SQL튜닝
- Oracle
- 한입크기로 잘라먹는 리액트
- 인덱스
- 멀티스레딩
- 자바의정석
- 리액트
- @Configuration
- Node.js
- 시큐리티
- Spark
- 데브캠프
- SQL
- MySQL
- 스프링의정석
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |