`ANALYZE` — 통계 정보 수집

ANALYZE — 통계 정보 수집

플래너(planner)가 좋은 실행 계획을 세우려면 테이블의 데이터 분포에 대한 통계가 필요해요. 그 통계를 수집해서 데이터베이스에 기록하는 명령이 ANALYZE예요. 보통 VACUUM과 함께 자동으로 실행되기도 하죠.

출처: PostgreSQL 문서

본문

ANALYZE는 데이터베이스의 테이블 내용에 대한 통계를 수집하고, 그 결과를 pg_statistic 시스템 카탈로그에 저장해요. 플래너가 쿼리 실행 계획을 세울 때 이 통계를 사용해요.

Synopsis (개요)

ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ]
ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ]

where option can be one of:

    VERBOSE [ boolean ]
    SKIP_LOCKED [ boolean ]

and table_and_columns is:

    table_name [ * ] [ ( column_name [, ...] ) ]

Description (설명)

ANALYZE는 테이블 내용의 통계를 수집해 pg_statistic에 저장해요. 테이블 이름을 생략하면 현재 데이터베이스의 모든 테이블에 대해 통계를 수집하지만(임시 테이블은 포함), 통계가 없거나 "충분히 최신이 아닌(stale)" 테이블만 처리할 수도 있어요.

열 목록을 지정하면 그 열에 대해서만 통계를 수집해요. table_name *처럼 별표를 붙이면 상속된 자식 테이블까지 포함해요.

VERBOSE를 지정하면 진행 상황과 수집된 통계 요약을 출력해요. SKIP_LOCKED를 지정하면 처리 중 잠길 수 없는 관계는 건너뛰고 나머지에 대해서만 작업해요.

이 명령은 플래너 성능을 높이기 위한 것이며, ANALYZE 실행 결과는 정확한 데이터를 반환하는 것과는 별개로 플래너가 세우는 계획의 품질에 영향을 줘요.

Parameters (파라미터)

  • VERBOSE — 처리되는 각 테이블을 나열하고 통계 요약을 표시할지 여부.
  • SKIP_LOCKED — 잠금을 얻지 못한 관계를 건너뛸지 여부.
  • table_name — 분석할 테이블의 이름(선택적으로 스키마로 한정). 생략 가능.
  • column_name — 분석할 열. 지정하지 않으면 모든 열을 분석해요.

Notes (주의)

ANALYZE에는 해당 테이블에 대한 권한이 필요 없어요. 단, 테이블 소유자나 슈퍼유저가 아닌 경우 통계가 다른 사용자에게 공개되는 것을 피하고 싶다면 제한이 있을 수 있어요.

대규모 테이블에서 모든 열을 분석하는 것은 시간이 걸릴 수 있어요. 실행 계획이 좋지 않다면 ANALYZE를 자주 실행하는 것보다 관련 열만 골라 실행하는 것이 나을 수 있어요.

기본적으로 PostgreSQL은 수집된 샘플로 추정치를 만들기 때문에 정확한 값이 아니에요. 다만 플래너가 계획을 세우기에는 충분히 정확해요.

Examples (예시)

단일 테이블을 분석하는 예시예요.

ANALYZE mytable;

특정 열만 분석하는 예시예요.

ANALYZE mytable (col1, col2);

모든 테이블에 대해 상세 출력과 함께 분석하는 예시예요.

ANALYZE VERBOSE;

Compatibility (호환성)

SQL 표준에는 ANALYZE 문이 없어요.

더 알아보기 (Learn more)

  • 통계를 기반으로 실행 계획을 세우는 플래너에 대한 자세한 내용은 PostgreSQL 문서의 성능 튜닝 섹션에서 확인할 수 있어요.
  • VACUUM 명령은 테이블을 정리하면서 자동으로 통계를 갱신하기도 해요.