선택 심화 · 현재 보류: 이 페이지의 실행계획은 원문에 제시된 예상·개념적 예시이며 이번 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가 많아도 반복 접근 문제는 여전히 존재할 수 있다.



