티스토리 뷰

조회 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. 조인 연산

조인 연산은 관련된 열을 기준으로 두 개 이상의 테이블에서 행을 결합하는 것을 포함합니다.

예를 들어, OrdersCustomers 테이블이 있고, 특정 고객이 주문한 모든 주문의 세부 정보를 찾아야 하는 경우가 있을 수 있습니다.
이는 조인 연산을 포함할 수 있습니다.

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;

단계별로 설명하면:

  1. 데이터베이스 엔진은 Orders 테이블을 스캔하기 시작합니다.
  2. Order에 대해 CustomerID가 두 테이블에서 일치하는 Customer를 찾습니다.
  3. 결과로 OrderCustomer 정보를 결합한 새로운 가상 테이블이 생성됩니다.
  4. 이 가상 테이블이 결과로 반환됩니다.

반면에 이 작업을 DB Lookup으로 수행하려고 하면, 각 Order에 대해 Customer를 개별적으로 찾아야 하므로, 백만 개의 레코드를 다루는 경우에는 훨씬 느릴 수 있습니다.

그러나 둘 모두의 효율성은 인덱싱, 사용되는 데이터베이스 엔진, 쿼리의 복잡성, 작업의 특정 요구사항 등 여러 요인에 크게 의존합니다.
따라서 성능을 모니터링하고 필요에 따라 데이터베이스 설계와 쿼리를 최적화하는 것이 중요합니다.

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

728x90

'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