Backend Buffer(백엔드 버퍼)는

PostgreSQL에서 각 클라이언트(세션)별로 개별적으로 할당되는 메모리 영역이다.
이 버퍼는 쿼리 실행 시 필요한 데이터를 저장하거나 연산을 수행하는 공간으로 활용되며,

공유 메모리(shared_buffers)와는 다르게 개별 프로세스에서만 사용된다.

 

1️⃣ Backend Buffer란?

  • PostgreSQL은 클라이언트 요청마다 개별적인 Backend Process를 생성하고, 각 프로세스는 독립적인 메모리 공간을 갖는다.
  • 이 개별 프로세스가 사용하는 메모리 버퍼가 Backend Buffer.
  • 주요 구성 요소:
    • work_mem
    • temp_buffers
    • maintenance_work_mem
    • catalog_cache
    • optimizer/executor memory

Backend Buffer는 개별 세션에만 영향을 주며, PostgreSQL 서버 전체 공유가 불가능하다.


2️⃣ Backend Buffer의 주요 구성 요소 분석

 (1) work_mem (쿼리 실행 시 작업 메모리)

  • 정렬(SORT), 해시 조인(HASH JOIN), 그룹화(GROUP BY) 같은 작업을 수행할 때 사용다.
  • work_mem을 초과하면 임시 디스크 저장소(temp file)를 사용하게 되어 성능이 저하될 수 있음.

💡 튜닝 포인트:

  • work_mem이 너무 낮으면 쿼리 성능 저하 (디스크 I/O 증가)
  • work_mem이 너무 높으면 메모리 부족 현상 발생 가능 (OOM, Out Of Memory)
  • 일반적으로 1GB RAM당 4MB ~ 16MB 정도 설정 추천.
-- work_mem이 초과되어 임시 디스크를 사용하는지 확인.
SELECT datname, temp_bytes, temp_files FROM pg_stat_database;
-- temp_bytes 값이 크다면 work_mem이 부족하여 디스크를 사용 중인 상태

 

 (2) temp_buffers (임시 테이블을 위한 버퍼)

  • 세션 내에서 생성된 임시 테이블의 데이터를 캐싱하는 메모리 공간.
  • 개별 세션에서만 접근 가능하며, 세션이 종료되면 자동으로 메모리 해제됨.

💡 튜닝 포인트:

  • 임시 테이블을 자주 사용하는 워크로드(ETL, 데이터 분석 등)에서는 값을 늘리면 성능 향상 가능
  • 기본값은 8MB, ETL 작업이 많다면 64MB 이상으로 조정 가능

 

 (3) maintenance_work_mem (유지보수 작업을 위한 메모리)

  • VACUUM, CREATE INDEX, ALTER TABLE, CLUSTER 같은 유지보수 작업을 수행할 때 사용되는 메모리.
  • work_mem보다 더 많은 메모리가 필요할 수 있음.

💡 튜닝 포인트:

  • VACUUM FULL, REINDEX 등을 실행할 때 충분한 메모리가 필요하므로, 일반적으로 work_mem의 10배 정도 설정 추천.
  • 기본값은 64MB, 인덱스 크기가 큰 테이블에서는 1GB ~ 4GB로 증가 가능.

 

 (4) catalog_cache (시스템 카탈로그 캐싱)

  • PostgreSQL의 시스템 카탈로그(메타데이터 테이블)를 저장하는 버퍼.
  • 테이블 구조, 인덱스 정보, 권한 등 DDL 관련 정보를 빠르게 조회할 수 있도록 도와줌.

💡 튜닝 포인트:

  • pg_class, pg_attribute, pg_proc 같은 시스템 카탈로그를 자주 조회하는 경우 증가 가능.
  • 대규모 데이터베이스에서 DDL이 많다면 성능 향상을 위해 증가 가능.

 

(5) optimizer/executor (쿼리 최적화 및 실행 엔진 메모리)

  • PostgreSQL의 쿼리 최적화 및 실행을 위한 메모리 공간.
  • EXPLAIN ANALYZE 실행 시 사용하는 쿼리 실행 계획을 최적화하는데 필요한 공간.

💡 튜닝 포인트:

  • 일반적으로 PostgreSQL이 자동으로 관리하므로 튜닝이 필요하지 않음.
  • 대규모 조인 및 복잡한 쿼리를 실행할 때만 필요.

 

3️⃣ Backend Buffer 관련 최적화 전략

워크로드에 맞는 work_mem 설정

  • work_mem이 너무 낮으면 정렬, 조인 시 성능 저하 발생
  • work_mem을 높이면 쿼리 성능 향상 가능하지만 너무 크게 설정하면 메모리 부족(OOM) 발생
  • 보통 1GB RAM당 4MB ~ 16MB 추천

임시 테이블을 많이 사용하면 temp_buffers 증가

  • ETL, 데이터 분석 작업 시 temp_buffers를 64MB ~ 128MB로 조정 가능

자동 VACUUM이 너무 오래 걸린다면 maintenance_work_mem 증가

  • maintenance_work_mem을 충분히 확보하면 VACUUM, CREATE INDEX 속도 향상

시스템 카탈로그 접근이 많다면 catalog_cache 튜닝 고려

  • 데이터베이스 규모가 크다면 시스템 메타데이터 캐싱을 최적화하면 성능 향상 가능

 

정리

Backend Buffer는 개별 세션에서만 사용되는 메모리 영역이며,
✅ work_mem, temp_buffers, maintenance_work_mem 등의 설정이 쿼리 성능에 직접적인 영향을 미침
✅ shared_buffers와 다르게 공유되지 않고 개별 프로세스에서만 유지
적절한 튜닝을 통해 정렬(SORT), 조인(JOIN), 임시 테이블 사용 성능을 최적화 가능

 

 

+ Recent posts