DB프로그래밍

[PostgreSQL] 가장 디스크를 많이 괴롭히는 쿼리 top 10 뽑기


디스크를 많이 괴롭히는 쿼리을 뽑아낸 뒤, 그 쿼리들에 인덱스를 주거나 쿼리 실행 방식을 효율적으로 바꾸는 작업을 진행하시면 됩니다.

SELECT

   query,

   calls,

   -- 1회 실행당 평균 캐시 오염/작성 블록 수

   round((shared_blks_dirtied + shared_blks_written)::numeric / calls, 2) as avg_write_blocks,

   -- 1회 실행당 평균 WAL 생성 크기 (바이트 단위)

   round(wal_bytes::numeric / calls, 2) as avg_wal_bytes,

   -- 전체 누적 쓰기 부하 기준 정렬

   shared_blks_dirtied + shared_blks_written as total_writes

FROM pg_stat_statements

WHERE calls > 0

ORDER BY total_writes DESC

LIMIT 10;
  • PostgreSQL에서 블록(Block) 1개의 크기는 기본적으로 8KB입니다. 이 단위를 기준으로 계산하면 감을 잡기 쉽습니다.


avg_write_blocks (회당 평균 쓰기 블록)

  • 좋음 (정상): 10 이하. 단순 한 건 수정/삽입은 블록을 거의 건드리지 않습니다.
  • 나쁨 (위험): 100 이상. 한 번 실행할 때마다 메모리와 디스크에 가하는 부하가 큽니다.
  • 매우 나쁨 (최악): 1,000 이상. 인덱스가 너무 많거나 대량의 데이터를 통째로 쓰고 있다는 뜻입니다.


avg_wal_bytes (회당 평균 WAL 로그 생성량)

  • 좋음 (정상): 10KB (10,240) 이하. 일반적인 트랜잭션 수준입니다.
  • 나쁨 (위험): 1MB (1,048,576) 이상. 트랜잭션 로그가 쏟아져 나와 디스크 쓰기 병목(I/O 스트레스)을 유발합니다.

[연관 자료]

[PostgreSQL]pg_stat_statements 뷰를 조회하여 디스크/메모리 버퍼를 과도하게 사용(I/O 부하 유발)하는 쿼리들을 상위 순위로 추출방법 및 실행계획 튜닝

[PostgreSQL]프로시저 또는 함수내에서 특정 컬럼이나 문자열 찾는 쿼리

Hi, I’m 관리자