Search

REMINDER 11-09. Buffers를 통해 실제 데이터 접근량을 확인하자

⚠️
선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 PostgreSQL 실측 결과가 아닙니다. SQL/인덱스 설정은 검증 후 적용해야 합니다.
상황: 회원등급 PLAT의 주문 총금액을 조회할 때 메모리 적중과 페이지 읽기량을 알고 싶다.

BAD SQL — 비교 대상

EXPLAIN SELECT SUM(o.ord_amt) AS total_ord_amt FROM ms_mbr_big AS m JOIN tr_ord_big AS o ON o.mbr_id = m.mbr_id WHERE m.mbr_gd = 'PLAT';
SQL
복사

GOOD SQL — 개선 후보

EXPLAIN (ANALYZE, BUFFERS, COSTS OFF) SELECT SUM(o.ord_amt) AS total_ord_amt FROM ms_mbr_big AS m JOIN tr_ord_big AS o ON o.mbr_id = m.mbr_id WHERE m.mbr_gd = 'PLAT';
SQL
복사
예상 실행계획 — 실측 아님
BAD (가능한 추정 계획) Aggregate -> Hash Join Hash Cond: (o.mbr_id = m.mbr_id) -> tr_ord_big 스캔 -> Hash -> ms_mbr_big 스캔 (mbr_gd = 'PLAT') → 실제 페이지 접근 정보는 알 수 없음 GOOD (같은 조인 형태가 선택된 경우의 측정 항목) Aggregate Buffers: shared hit/read = [실측값] -> Hash Join Buffers: shared hit/read = [실측값] -> tr_ord_big 스캔 Buffers: shared hit/read = [실측값] -> Hash -> ms_mbr_big 스캔 Buffers: shared hit/read = [실측값] shared hit: PostgreSQL 공유 버퍼에서 찾은 블록 shared read: 공유 버퍼로 읽어 들인 블록 temp read/written: 임시 파일 I/O 발생 단서 [실측 예시 수치는 만들지 않음]
Plain Text
복사

핵심

•
실행시간은 시스템 상태·캐시·동시 부하의 영향을 받는다. 어떤 테이블이나 인덱스에서 읽기를 많이 했는지 확인하면 반복 스캔·필터·과도한 JOIN의 근거를 찾기 쉽다.
원본 규칙: 개편 전 12-09.
💡
참고·예외
•
shared read는 PostgreSQL 공유 버퍼에 없던 페이지를 읽는 작업이며, OS 파일 캐시에서 충족될 수도 있어 매번 저장장치의 물리 읽기가 발생했다는 뜻은 아니다. 부모 노드의 Buffers에는 하위 노드 처리가 반영될 수 있으므로, 부모와 자식의 Buffers를 모두 합산해 전체 I/O로 계산하지 않는다. hit가 많아도 반복 접근 문제는 여전히 존재할 수 있다.