← 원문 보기

🃏 치트시트 · 2026년 6월 13일

정렬·해시는 메모리가 부족하면 어디로 새는가, PGA, work_mem, Workspace Memory

"SQL 레벨업"이 한 문장으로 압축한 정렬·해시의 메모리 spill을, 알고리즘부터 Oracle·PostgreSQL·SQL Server의 실제 동작까지 단계별로 풀어본다.

한 문장에서 시작된 의문

  • "SQL 레벨업"을 읽다가 다음 문단이 눈에 들어왔다.
  • 무엇이
  • 각각 어떻게

정렬·해시·Spill의 알고리즘적 본질

  • 대부분의 SQL 연산은 스트리밍으로 동작한다.
  • 스트리밍
  • 블로킹(blocking) 연산자
  • 전부 모은 뒤에야

3-tier 모델: Optimal · One-pass · Multi-pass

  • 알고리즘 본 절 뒤끝에 본 세 단계, "충분/약간 부족/심하게 부족", 에 이름을 붙여보자.
  • 추가 I/O = 2 × 데이터 크기
  • 1 GB 정렬에 22 MB 메모리만 있어도 One-pass로 처리 가능하다
  • 약 2.8 MB

세 DBMS는 같은 문제를 다르게 푼다

  • 여기까지가 보편 이론이다.
  • 메모리 할당 단위
  • 예약 시점
  • 모니터링 인터페이스

Oracle, PGA와 자동 관리

  • 왜 SGA가 아니라 PGA인가
  • SGA (System Global Area)
  • 공유 메모리
  • PGA (Program Global Area)

PostgreSQL, workmem과 단위의 함정

  • Oracle은 자동 관리가 매력이었다.
  • 단순하고 예측 가능하지만, 단위가 작아서 위험하다.
  • a query operation
  • before writing to temporary disk files

SQL Server, 정적 예약과 적응형 학습

  • Oracle도 PostgreSQL도 실행 중에 메모리를 동적으로 할당한다.
  • 실행 중
  • 쿼리 시작 전에 필요량을 다 예약한다.
  • Memory Grant

같은 그림, 다른 이름, 한 장 비교표

  • 세 DBMS가 같은 3-tier 비용 모델을 어떻게 다르게 구체화했는지 한 표로:
  • 메모리 영역 이름
  • 할당 단위
  • 노드당

정리

  • 책의 한 문장 "메모리가 부족하면 일시 영역을 쓴다"의 안쪽에는 알고리즘 차원, 모드 차원, 구현 차원의 세 층이 숨어 있었다.
  • 알고리즘 차원
  • 다른 알고리즘이 돌아간다
  • 모드 차원

참고 자료

  • Oracle Database Performance Tuning Guide, Tuning the Program Global Area
  • PostgreSQL Docs, 19.4. Resource Consumption (workmem, hashmemmultiplier)
  • PostgreSQL Docs, 14.1. Using EXPLAIN (Sort Method, Buckets/Batches)