PostgreSQL 미드레벨 코딩·알고리즘 면접

PostgreSQL 미드레벨 (3~7년) 코딩 · 알고리즘 3문항 조회수 40 · 2026-09-07 (월) 17:41:02
1 쿼리 최적화 알고리즘
Medium

Q. 100만 건의 주문 데이터에서 각 고객의 최근 3개 주문을 조회해야 합니다. DISTINCT ON, Window Function(ROW_NUMBER), Lateral Join 세 가지 접근법의 알고리즘적 차이를 설명하고, 각각의 시간 복잡도와 메모리 사용량을 비교해주세요. 또한 고객 수가 10만 명이고 인덱스가 (customer_id, order_date DESC)로 구성되어 있을 때 어떤 방법이 가장 효율적인지 설명해주세요.

각 방법이 데이터를 정렬하고 필터링하는 순서와, 인덱스를 활용할 수 있는지 여부를 고려해보세요.

A. 모범답안

DISTINCT ON은 정렬 후 첫 번째 행만 선택하는 방식으로 O(n log n) 정렬 비용이 발생하지만 메모리 사용이 적습니다. ROW_NUMBER는 전체 파티션을 윈도우 함수로 처리하므로 O(n log n) 정렬과 추가 메모리가 필요하며, WHERE 절에서 rn <= 3 필터링이 외부 쿼리에서 발생해 비효율적입니다. Lateral Join은 각 고객마다 서브쿼리를 실행하는 방식으로, 인덱스가 (customer_id, order_date DESC)로 구성되어 있으면 각 고객당 O(1) Index Scan으로 상위 3개만 조회하므로 전체 O(m)의 시간 복잡도를 가집니다. 이 시나리오에서는 Lateral Join이 인덱스를 최대한 활용하여 불필요한 정렬을 피하므로 가장 효율적이며, 실행 계획에서 Nested Loop + Index Scan으로 나타납니다.

핵심 포인트
  • • DISTINCT ON은 정렬 기반 O(n log n) 알고리즘
  • • ROW_NUMBER는 윈도우 함수로 전체 데이터 처리 후 필터링
  • • Lateral Join은 인덱스를 활용한 고객별 Top-N 조회로 O(m) 달성
  • • 복합 인덱스 구조가 쿼리 알고리즘 선택에 결정적 영향
답변에 넣으면 좋은 키워드
DISTINCT ON ROW_NUMBER Lateral Join 시간 복잡도 Index Scan Top-N 쿼리
실무에서는

대시보드에서 각 카테고리별 최신 상품 N개를 조회하거나, 사용자별 최근 활동 이력을 표시할 때 사용됩니다.

Follow-up 질문

만약 인덱스가 없는 상태라면 세 가지 방법의 성능 순서가 어떻게 바뀌며, 각각 어떤 실행 계획을 선택하게 될까요?

2 재귀 알고리즘 설계
Hard

Q. 소셜 네트워크에서 친구 추천 기능을 구현하려고 합니다. '친구의 친구'를 2단계 깊이까지 탐색하되, 이미 친구인 사람과 본인은 제외해야 합니다. 친구 관계가 양방향으로 저장된 friendship 테이블(user_id, friend_id)이 있을 때, WITH RECURSIVE를 사용한 알고리즘 설계 전략을 설명하고, 순환 참조 방지를 위한 visited 배열 관리 방법과 전체 알고리즘의 시간 복잡도를 분석해주세요. 또한 사용자당 평균 친구가 100명일 때 성능 최적화 방안을 제시해주세요.

재귀 CTE에서 depth 제한과 이미 방문한 경로를 배열로 추적하는 방법을 고려하고, 양방향 관계의 중복 처리를 생각해보세요.

A. 모범답안

WITH RECURSIVE를 사용해 base case로 1단계 친구를 선택하고, recursive case에서 depth < 2 조건으로 제한합니다. 순환 참조 방지를 위해 path 배열(INTEGER[])에 방문한 user_id를 누적하고, NOT (next_friend = ANY(path)) 조건으로 이미 방문한 노드를 제외합니다. 양방향 관계이므로 UNION을 사용해 user_id와 friend_id를 모두 탐색하되, 최종 결과에서 본인과 1단계 친구를 NOT IN 서브쿼리로 제외합니다. 시간 복잡도는 평균 친구 100명 기준 O(100²) = O(10,000)이며, 배열 연산이 추가되어 실제로는 더 높습니다. 최적화를 위해 (user_id, friend_id)와 (friend_id, user_id) 양방향 인덱스를 생성하고, DISTINCT를 사용해 중복 경로를 조기에 제거하며, LIMIT으로 추천 수를 제한하여 불필요한 탐색을 줄입니다. 대규모 네트워크에서는 재귀 CTE 대신 애플리케이션 레벨에서 BFS 알고리즘을 구현하거나 그래프 데이터베이스를 고려해야 합니다.

핵심 포인트
  • • depth 제한과 path 배열을 사용한 순환 참조 방지
  • • 양방향 관계 처리를 위한 UNION과 중복 제거 전략
  • • 평균 차수 기반 O(d²) 시간 복잡도 분석
  • • 인덱스, DISTINCT, LIMIT을 활용한 조기 종료 최적화
  • • 대규모 그래프에서는 재귀 CTE의 한계 인식
답변에 넣으면 좋은 키워드
WITH RECURSIVE BFS 순환 참조 path 배열 그래프 탐색 시간 복잡도
실무에서는

LinkedIn의 인맥 추천, Facebook의 친구 추천, 조직도에서 간접 보고 라인 탐색 등에 활용됩니다.

Follow-up 질문

만약 3단계 이상 깊이로 확장하거나 가중치가 있는 관계(친밀도 점수)를 고려한다면 알고리즘을 어떻게 수정하시겠습니까?

3 집계 알고리즘 최적화
Hard

Q. 실시간 분석 대시보드에서 시간대별(1시간 단위) 활성 사용자 수를 계산해야 합니다. 이벤트 로그 테이블에는 (user_id, event_time) 데이터가 1억 건 있으며, 같은 사용자가 1시간 내 여러 이벤트를 발생시킬 수 있습니다. GROUP BY와 COUNT(DISTINCT), Window Function과 DENSE_RANK, 그리고 두 단계 집계(시간대별 중복 제거 후 카운트) 방식의 알고리즘을 비교하고, 각각의 공간 복잡도와 실행 계획상 차이점을 설명해주세요. 또한 PostgreSQL의 HyperLogLog 확장(postgresql-hll)을 사용한 근사 알고리즘의 장단점을 설명해주세요.

COUNT(DISTINCT)는 내부적으로 정렬이나 해시를 사용하며, 두 단계 집계는 중간 결과 크기를 줄이는 전략입니다.

A. 모범답안

COUNT(DISTINCT user_id)는 각 시간대 그룹마다 해시 테이블을 생성하여 중복을 제거하므로 O(n) 시간과 O(k) 공간(k는 고유 사용자 수)이 필요하며, work_mem 설정에 따라 디스크 정렬이 발생할 수 있습니다. Window Function과 DENSE_RANK는 전체 데이터를 (event_time, user_id)로 정렬한 후 순위를 매기는 방식으로 O(n log n) 시간과 추가 메모리가 필요하며, 실행 계획에서 WindowAgg 노드가 나타납니다. 두 단계 집계는 먼저 (date_trunc('hour', event_time), user_id)로 중복 제거한 후 시간대별 COUNT하는 방식으로, DISTINCT 서브쿼리가 중간 결과를 줄여 메모리 효율적이지만 두 번의 집계 연산이 필요합니다. HyperLogLog는 O(1) 공간으로 근사 카운팅을 제공하며 오차율 2% 이내로 매우 큰 카디널리티에서 유리하지만, 정확한 값이 필요한 경우 사용할 수 없습니다. 1억 건 규모에서는 (event_time, user_id) 복합 인덱스와 함께 두 단계 집계 방식이 중간 결과 크기를 최소화하여 가장 효율적이며, 실시간성이 중요하고 근사치로 충분하다면 HyperLogLog가 최선입니다.

핵심 포인트
  • • COUNT(DISTINCT)는 O(n) 시간, O(k) 공간의 해시 기반 알고리즘
  • • Window Function은 O(n log n) 정렬 기반으로 메모리 부담 큼
  • • 두 단계 집계는 중간 결과 축소로 메모리 효율 향상
  • • HyperLogLog는 O(1) 공간의 확률적 근사 알고리즘
  • • 인덱스 구조와 work_mem이 알고리즘 성능에 결정적 영향
답변에 넣으면 좋은 키워드
COUNT DISTINCT 카디널리티 해시 집계 HyperLogLog 근사 알고리즘 공간 복잡도
실무에서는

실시간 대시보드의 MAU/DAU 계산, 광고 캠페인의 순 도달률 측정, 로그 분석 시스템의 고유 방문자 집계에 사용됩니다.

Follow-up 질문

만약 슬라이딩 윈도우 방식으로 최근 24시간의 시간대별 활성 사용자를 실시간으로 계산해야 한다면 어떤 자료구조와 알고리즘을 사용하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!