Memory의 분류
PostgreSQL은 Server 시작 시 공용 메모리 공간인 Shared Memory가 할당하며 Backend 프로세스를 위한 Local Memory도 할당합니다.
Shared Memory란 Data Block 및 트랜잭션 로그와 같은 정보들을 캐싱하는 공간으로 PostgreSQL Server의 모든 프로세스들에 의해 공유되는 영역이기도 합니다. 또한 Process, Lock, global 통계 정보 역시 해당 영역에 위치합니다.
이와는 별개로, Backend 프로세스별로 할당되어 공유가 불가능한 Local Memory라는 영역도 존재하는데, 해당 영역은 Sort, Vacuum 등의 요청을 처리하기 위한 작업 영역입니다.

Shared Memory
Shared Memory는 모든 프로세스가 공유해서 사용하며 Oracle의 SGA영역과 유사합니다. Shared Memory의 구성 요소 중 대표적인 4가지 영역에 대해 알아보겠습니다.
Shared Buffer
- Oracle의 Buffer Cache와 유사하며 Data와 Data의 변경사항을 Block 단위로 캐싱하여 I/O를 빠르게 처리하기 위한 영역입니다.
- postgresql.conf의 shared_buffers 파라미터 값으로 크기를 설정할 수 있습니다. Default값은 128MB이며, 1GB 이상의 RAM이 있는 서버의 경우 시스템 메모리의 25%를 권장합니다.
- Shared Buffer에 기록되는 단위는 block_size (Default 8K) 단위입니다.
📌 PostgreSQL에서 Page라는 용어를 주로 사용하지만 Block과 혼용하여 사용하기도 합니다. 두 용어의 차이를 존재하는 위치에 따라 분류하기도 하지만 본 문서에서는 모두 동일한 의미로 사용합니다.
WAL Buffer (Write Ahead Log Buffer)
- Session들이 수행하는 트랜잭션에 대한 변경 로그를 캐싱하는 공간으로 복구 작업 시 Data를 재구성할 수 있도록 하는 영역입니다.
- postgresql.conf의 wal_buffers 파라미터 값으로 크기를 설정할 수 있습니다. Default값은 -1로 shared_buffers의 1/32와 같은 값으로 지정합니다.
Clog Buffer (Commit Log Buffer)
- 각 트랜잭션의 상태(in_progress, committed, aborted) 정보를 캐싱하는 공간으로 모든 트랜잭션의 상태가 있으며 완료 여부를 확인할 수 있도록 하는 영역입니다.
- 따로 사이즈를 설정할 수 있는 Parameter는 없으며 Database 엔진에 의해 자동 관리됩니다.
Lock Space
- Shared Memory 영역 중 Lock과 관련된 내용을 보관하는 영역으로 PostgreSQL 인스턴스에서 사용하는 모든 유형의 Lock정보를 저장합니다. (Lock정보는 모든 백그라운드 프로세스 및 사용자 프로세스에 의해 공유됩니다.)
- 사용자가 특정 테이블에 Access하는 경우, 특정 트랜잭션이 해당 테이블을 삭제 또는 수정(DDL) 하지 않도록 활동을 추적해야 합니다. 이 활동에 대한 정보를 저장하는 공간이 바로 Lock Space입니다.
📌 Lock Space에서 유지할 수 있는 Lock의 수는 max_locks_per_transaction * (max_connections + max_prepared_transactions)입니다.
Local Memory (Process Memory)
개별 Backend 프로세스가 할당 받아 사용하는 공간으로 Oracle의 PGA와 유사합니다. 해당 영역의 수치는 개별 공간의 크기를 의미하므로 전체 Connection 수치를 감안하여 설정해야 합니다.
또한 기본적으로 Local Memory는 세션 단위로 할당되지만 트랜잭션 단위로 임의 조정이 가능합니다.
Maintenance Work Memory
- 유지 관리 작업에 사용되는 메모리로 maintenance_work_mem의 기본값은 64MB입니다.
- Vacuum관련 작업, 인덱스 생성, 테이블 변경, Foreign Key 추가 등의 작업에 사용되는 공간입니다.
- 관련 작업의 성능을 향상시키리면 해당 영역의 사이즈를 증가시켜야 합니다.
Temp Buffer
- Temporary 테이블에 사용되는 공간으로 temp_buffers의 기본값은 8MB입니다.
- Temp 테이블을 사용하는 경우에만 할당되는 영역이며, Session단위로 할당되는 비 공유 메모리 영역이므로 과도한 Temp 테이블 사용시 문제가 될 수 있습니다.
- 해당 영역은 Temp 파일과 상관이 없습니다. (Work Memory 참조)
Work Memory
- 과도한 Sort/Hash 작업이 발생하여 Temp 파일을 사용하기 전에 사용되는 공간으로 work_mem의 기본값은 4MB입니다.
- 여타 Local Memory 와 동일하게 동시에 여러 Session에서 과도한 Sort/Hash 연산을 수행할 경우 문제가 될 수 있습니다.
📌 정렬작업(Sort) 에는 ORDER BY, DISTINCT, MERGE JOIN 등이 있으며, Hash Operation에는 HASH JOIN, HASH AGGREGATION, IN SUBQUERY 등이 있습니다.
Catalog Cache
- System Catalog 메타데이터를 이용할 때 사용하는 공간입니다. 세션들이 메타데이터를 조회하는 경우가 빈번하고, 이때 디스크에서 읽을 경우 속도저하가 발생할 수 있기 때문에 개별 메모리에 존재합니다.
Optimizer & Executor
- 수행한 Query들에 대한 최적의 실행계획을 수립하고 실행계획에 따른 실행을 담당하는 메모리 공간입니다.
함께 보면 좋은 아티클
