🃏 치트시트 · 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)