조회 Vs Join 무엇이 더 효율적인가
🐥 카카오테크캠퍼스 - 2단계 1주차 과제 분석을 하고 있는데, 자연스럽게 조회와 Join 중 무엇이 효율적인가 고민하게 되었습니다
사실 그냥 만드는거라면, 쓱쓱 만들면 되는데 그런게 아니라 대용량 처리나 잦은 조회 등의 문제도 생각해보고 싶었습니다
일단 조회(DB Lookup)와 조인 연산은 관계형 데이터베이스에서 수행하는 일반적인 작업입니다.
둘 다 데이터베이스로부터 정보를 검색하는 방법이지만, 특정 시나리오에 따라 성능에 다른 영향을 미칠 수 있습니다.
1. 데이터베이스 조회 (DB Lookup)
DB Lookup은 특정 데이터를 찾기 위해 데이터베이스의 단일 테이블을 쿼리하는 것을 포함합니다.
예를 들어, Customers
테이블이 있고, ID로 고객의 세부 정보를 찾아야 하는 경우를 생각해봅시다.
SELECT * FROM Customers WHERE CustomerID = 123;
데이터베이스는 하나의 테이블만을 다루며, CustomerID = 123
인 특정 행을 찾습니다.
DB Lookup은 다음 경우에 유리할 수 있습니다:
- 단일 테이블로부터 데이터를 가져와야 하는 경우
- WHERE 절에서 사용하는 열(우리 예제의
CustomerID
처럼)에 인덱스가 있는 테이블, 즉 조회가 빠르게 이루어질 수 있는 경우 - 테이블의 특정 행에 대해 CRUD(Create, Read, Update, Delete) 연산을 수행해야 하는 경우
2. 조인 연산
조인 연산은 관련된 열을 기준으로 두 개 이상의 테이블에서 행을 결합하는 것을 포함합니다.
예를 들어, Orders
와 Customers
테이블이 있고, 특정 고객이 주문한 모든 주문의 세부 정보를 찾아야 하는 경우가 있을 수 있습니다.
이는 조인 연산을 포함할 수 있습니다.
SELECT Orders.OrderID, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
WHERE Customers.CustomerID = 123;
조인 연산은 다음 경우에 유리할 수 있습니다:
- 여러 테이블에서 데이터를 가져와야 하는 경우
- 하나 이상의 열을 기반으로 테이블 간의 관계가 있는 경우
- 여러 테이블의 데이터를 사용해야 하는 작업을 수행해야 하는 경우
상황: 대량 처리
백만 개 이상의 주문이 있는 쿠팡 같은 대용량 애플리케이션을 가지고 있다고 가정해봅시다. 각 고객이 주문한 모든 주문을 보여주는 보고서를 생성하려고 합니다.
이 시나리오에서는 조인 연산이 더 효율적일 것입니다. Orders
테이블을 CustomerID
를 기준으로 Customers
테이블과 조인하고, 필요한 모든 데이터를 한 번에 가져올 수 있습니다.
SELECT Customers.CustomerName, Orders.OrderID
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
단계별로 설명하면:
- 데이터베이스 엔진은
Orders
테이블을 스캔하기 시작합니다. - 각
Order
에 대해CustomerID
가 두 테이블에서 일치하는Customer
를 찾습니다. - 결과로
Order
와Customer
정보를 결합한 새로운 가상 테이블이 생성됩니다. - 이 가상 테이블이 결과로 반환됩니다.
반면에 이 작업을 DB Lookup으로 수행하려고 하면, 각 Order
에 대해 Customer
를 개별적으로 찾아야 하므로, 백만 개의 레코드를 다루는 경우에는 훨씬 느릴 수 있습니다.
그러나 둘 모두의 효율성은 인덱싱, 사용되는 데이터베이스 엔진, 쿼리의 복잡성, 작업의 특정 요구사항 등 여러 요인에 크게 의존합니다.
따라서 성능을 모니터링하고 필요에 따라 데이터베이스 설계와 쿼리를 최적화하는 것이 중요합니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Backend' 카테고리의 다른 글
Mock API 작성하는 팁 (0) | 2023.07.10 |
---|---|
TypeORM의 Entity 참조는 어떻게 일어나는가? (0) | 2023.06.27 |
Secondary Index (0) | 2023.06.17 |
SA (0) | 2023.06.10 |
ESP (0) | 2023.06.10 |