각 클라이언트 요청은 해당하는 백엔드 프로세스가 담당합니다.
Parser
SQL 문장을 파싱하여 구문 트리(parse tree)로 변환.
Analyzer / Rewriter
의미 분석 및 Rule 시스템 적용 (View 등 변형 포함).
Planner / Optimizer
비용 기반 계획 수립. 여러 실행계획 중 최적의 계획 선택.
Executor
실제로 실행하면서 데이터를 읽고 연산함.
⇒ 디스크 I/O는 Executor 단계에서 발생
PostgreSQL은 디스크 I/O를 최소화하기 위해 Buffer Pool (Shared Buffers)를 사용.
그러나 버퍼에 없는 데이터를 읽어야 할 때는 디스크 I/O가 발생함.
공유 버퍼(shared_buffers)에 원하는 페이지가 없으면 → OS page cache에서 읽어옴
OS page cache에도 없으면 → 실제 디스크 I/O
<aside> 🐘
벡엔드 프로세스는,
read() 또는 pread() 같은 동기 시스템 콜로 직접 디스크에서 읽게 됨.
⇒ 이 I/O가 완료될 때까지 해당 백엔드 프로세스는 블로킹 상태
위와 같은 이유로,