work_mem
| 버전 | 기본값 | context | 타입 |
|---|---|---|---|
| 14 | four megabytes ( 4MB ) | user | integer |
| 15 | four megabytes ( 4MB ) | user | integer |
| 16 | four megabytes ( 4MB ) | user | integer |
| 17 | four megabytes ( 4MB ) | user | integer |
| 18 | four megabytes ( 4MB ) | user | integer |
| 19 | four megabytes ( 4MB ) | user | integer |
정렬이나 hash table 같은 쿼리 연산이 임시 디스크 파일을 쓰기 전까지 사용할 수 있는 기본 메모리 상한을 정한다. 단위 없이 값을 주면 킬로바이트로 해석하며, 기본값은 4MB다.
정렬은 ORDER BY, DISTINCT, merge join에서 쓰이고 hash table은 hash join, hash 기반 집계, memoize 노드, IN 서브쿼리의 hash 처리에 쓰인다. 각 연산은 work_mem이 정한 만큼의 메모리를 쓰다가 그 선을 넘으면 임시 파일로 흘려보낸다. 즉 work_mem이 작으면 정렬·hash가 디스크로 자주 떨어져 쿼리가 느려지고, 넉넉하면 메모리 안에서 끝나 빨라진다.
주의할 점은 이 값이 연산 하나당 한도라는 것이다. 복잡한 쿼리는 정렬과 hash를 여러 개 동시에 돌릴 수 있고, 여러 세션이 동시에 그런 연산을 수행할 수도 있다. 따라서 서버 전체가 실제로 쓰는 메모리는 work_mem 값의 몇 배에 달할 수 있다. 값을 키울 때는 이 점을 반드시 염두에 둬야 한다.
hash 기반 연산은 정렬 기반 연산보다 메모리 부족에 더 민감하다. hash table의 메모리 한도는 work_mem에 hash_mem_multiplier를 곱해 계산하므로, hash 연산은 기본 work_mem 한도를 넘는 메모리를 쓸 수 있다.
운영 노트:
work_mem은 전역으로 크게 잡기보다 동시 접속 수와 쿼리 복잡도를 고려해 보수적으로 두고, 무거운 배치나 리포트 쿼리에서 세션 단위로 SET work_mem을 올리는 편이 안전하다. 전역 값을 무리하게 올리면 동시 부하 상황에서 메모리가 폭증해 OOM으로 이어질 수 있다.출처: PostgreSQL 18 문서