Database ‐ Count Query Performance - dnwls16071/Backend_Summary GitHub Wiki

📚 PostgreSQL에서의 카운트 쿼리 동작에 대한 이해

  • 최신 PostgreSQL 버전 COUNT(*)에서는 일반적으로 COUNT(1) 보다 약간 빠르다고 한다.
  • 인수 없이 행을 계산하도록 최적화된 특별한 경우이기 때문에 COUNT(*) 각 행에 대한 상수를 평가하는 작은 오버헤드 COUNT(1)가 포함된다.
  • COUNT(*)의 경우 순차 스캔(Sequential Scan)을 수행하며 이는 대규모 데이터를 가질 수 있다고 판단되는 테이블에서는 성능이 느려질 수 있다.
  • WHERE절에서 인덱싱된 컬럼과 함께 사용을 하면 인덱스 전용 스캔이 사용될 수 있으며, 전체 테이블이 아닌 별도의 자료구조 인덱스에서 읽기 때문에 인덱스 스캔(Index Scan)이 수행되어 훨씬 더 빨라질 수 있다.
  • PostgreSQL에서 행이 삭제되면 즉시 제거되지 않고 Dead Tuple로 표시가 된다. 이로 인해 테이블 및 인덱스의 부풀림 현상이 발생할 수 있으며 데드 튜플은 공간을 소비하고 더 많은 데이터를 스캔해야 하기 때문에 쿼리 실행 속도가 저하될 수 있다. 이 때, VACUUM ANALYZE를 정기적으로 실행해주면 Dead Tuple을 정리하고 쿼리 플래너 통계를 업데이트하는 데 도움이 된다.