[PostgreSQL] Memory 구조 (4)
PostgreSQL Memory 구조
PostgreSQL은 크게 공용 메모리 공간인 Shared Memory 와 Backend 프로세스를 위한 Local Memory로 나뉩니다. 각각의 공간은 Oracle의 SGA, PGA 와 유사합니다.
Shared Memory
Shared Memory는 모든 프로세스가 공유해서 사용하며, Oracle의 SGA 영역과 유사합니다.
아래는 Shared Memory의 구성 요소중 대표적인 4가지 요소들입니다.
1. Shared Buffer
data의 변경사항을 block 단위로 caching하여 I/O를 빠르게 처리하기 위한 영역입니다.
shared_buffers 파라미터 (Default :128MB)으로 크기를 설정할 수 있습니다. Oracle의 Data Buffer Cache와 유사합니다.
2. WAL Buffer
Write Ahead Log Buffer의 줄임말로, 세션들이 수행하는 트랜잭션에 대한 변경 로그를 caching 하는 공간으로 복구 작업 시 data를 재구성할 수 있도록 하는 영역입니다.
3. Clog Buffer (Commit Log Buffer)
각 트랜잭션의 상태정보를 caching 하는 공간으로 모든 트랜잭션의 상태가 있으며 완료 여부를 확인할 수 있도록 하는 영역입니다. 데이터베이스 엔진에 의해 자동 관리됩니다.
4. Lock Space
Shared Memory 영역 중 Lock과 관련된 내용을 보관하는 영역으로 PostgreSQL 인스턴스에서 사용하 는 모든 유형의 Lock정보를 저장합니다. 사용자가 특정 테이블에 Acess할 때, 특정 트랜잭션이 해당 테이블을 삭제 또는 수정하지 않도록 활동을 추적해야 하는데, 이 활동에 대한 정보를 저장하는 공간이 바로 Lock Space입니다.
Local Memory
개별 Backend 프로세스가 할당 받아 사용하는 공간으로 Oracle의 PGA 영역과 유사합니다. 연결된 사용자마다 이 Memory 공간이 할당됩니다. 그렇기에 이 영역의 수치는 전체 Connection 수치를 감안하여 설정해야 합니다.
Local Memory의 구성 요소는 이러합니다.
1. Maintenance Work Memory
vacuum관련 작업, 인덱스 생성, 테이블 변경, FK(Foreign Key) 추가 등의 작업에 사용되는 공간입니다.
maintenance_work_mem의 기본값은 64MB이니 관련 작업의 성능을 향상시키려면 해당 영역의 사이즈를 증가시켜야 합니다.
2. Temp Buffer
Temporary 테이블에 사용되는 공간입니다. Temp 테이블을 사용하는 경우에만 할당되는 영역이며, 세션 단위로 할당되는 비 공유 메모리 영역이므로 과도한 Temp 테이블 사용시 문제가 될 수 있습니다.
해당 영역은 Temp File 과는 상관없습니다. Default 값은 8MB입니다.
3. Work Memory
과도한 Sort/Hash 작업이 발생하여 Temp File을 사용하기 전에 사용되는 공간입니다. work_mem의 기본 값은 4MB로, 여러 세션에서 과도한 Sort/Hash 연산을 수행할 경우 문제가 될 수 있습니다.
* 정렬작업(Sort)에는 ORDER BY, DISTINCT, MERGE JOIN 등이 있고, 해쉬작업(Hash)에는 HASH JOIN 등이 있습니다.
4. Catalog Cache
System Catalog 메타데이터를 이용할 때 사용하는 공간입니다. 세션들이 메타데이터를 조회하는 경우가 빈번하고, 이때 디스크에서 읽을 경우 속도저하가 발생할 수 있기 때문에 개별 메모리에 존재합니다.
5. Optimizer & Executor
수행한 쿼리들에 대한 최적의 실행계획을 수립하고 실행계획에 따른 실행을 담당하는 공간입니다.