도구스개발

PostgreSQL 인덱스 크기 추정기

로우 수·평균 키 크기·fillfactor로 PostgreSQL B-tree 인덱스가 디스크에서 차지할 대략적인 크기를 페이지 단위로 추정합니다.

바이트

복합 인덱스면 모든 컬럼을 합친 크기입니다. bigint=8, integer=4, 짧은 문자열은 대략 (평균 글자 수 + 1~4)바이트.

%

기본값은 90입니다. 낮출수록 크기는 커지지만 이후 삽입 시 페이지 분할이 줄어듭니다.

추정 인덱스 크기

21.4MB

페이지 2,742개 (8KB/페이지)

페이지당 평균 튜플 수366개
리프 페이지 수2,733개
내부(분기)+루트 페이지 수9개
줄 포인터(4B) + 인덱스 튜플 헤더(8B) + 키 데이터를 8바이트 단위로 올림한 값이 튜플 하나의 크기입니다. 페이지는 헤더(24B)·B-tree 특수공간(16B)을 뺀 8,152바이트 중 fillfactor 비율만큼만 채운다고 가정합니다.
추정치입니다. PostgreSQL 13+ 의 중복 키 압축(deduplication), TOAST, VACUUM이 회수하지 못한 빈 공간(bloat)은 반영하지 않았습니다. 정확한 값은 실제 데이터베이스에서 SELECT pg_size_pretty(pg_relation_size('인덱스이름'))로 확인하세요.

사용 방법

  1. 1인덱스를 만들 로우(행) 수를 입력합니다.
  2. 2인덱스 컬럼(들)의 평균 크기를 바이트 단위로 입력합니다 — 복합 인덱스면 모든 컬럼을 합친 크기입니다.
  3. 3fillfactor(페이지를 얼마나 채울지)를 확인하고, 예상 페이지 수·전체 크기를 확인합니다.

자주 묻는 질문

PostgreSQL은 8192바이트 고정 크기 페이지에 튜플을 채워 넣습니다. 튜플(키) 하나는 줄 포인터(4바이트) + 인덱스 튜플 헤더(8바이트) + 실제 키 데이터(8바이트 배수로 올림)를 차지하므로, 페이지에서 헤더·특수공간을 뺀 사용 가능 공간(8152바이트)을 이 크기로 나누면 페이지당 튜플 수가 나오고, 로우 수를 거기에 나누면 필요한 페이지 수가 나옵니다.

B-tree는 기본적으로 페이지를 90%까지만 채우고 10%는 이후 삽입을 위해 비워둡니다(fillfactor 90). fillfactor를 낮추면 같은 데이터에 더 많은 페이지가 필요해 크기는 커지지만, 나중에 값을 끼워 넣을 때 페이지 분할(page split)이 덜 일어나 삽입 성능이 좋아집니다. 반대로 값이 거의 바뀌지 않는 테이블이라면 fillfactor를 100에 가깝게 높여 크기를 줄일 수 있습니다.

네. 리프 페이지가 많아지면 그 위에 어느 리프로 가야 하는지 가리키는 내부 페이지가 쌓이고, 필요하면 그 위에 한 단계 더 쌓입니다(루트까지). 다만 분기계수(페이지 하나가 가리킬 수 있는 자식 수)가 보통 수백이라 전체 크기에서 차지하는 비중은 대부분 1% 미만입니다.

PostgreSQL 13부터는 중복된 키가 많으면 자동으로 압축(deduplication)해 실제 크기가 더 작게 나올 수 있고, 반대로 VACUUM이 아직 회수하지 못한 빈 공간(bloat)이 있으면 더 크게 나올 수 있습니다. 정확한 값은 이 추정치 대신 실제 데이터베이스에서 `SELECT pg_size_pretty(pg_relation_size('인덱스이름'))`으로 확인하세요.

알아두면 좋은 점

  • 구조체 크기는 PostgreSQL 16(REL_16_STABLE) 소스코드 기준이며, 8192바이트 기본 페이지 크기·64비트 빌드(MAXALIGN 8)를 가정합니다.
  • 키 중복이 많을 때 적용되는 PostgreSQL 13+ 중복 키 압축(deduplication)은 반영하지 않았습니다 — 실제 크기가 이 추정치보다 작을 수 있습니다.
  • TOAST(매우 긴 값의 별도 저장)나 VACUUM이 회수하지 못한 빈 공간(bloat)도 반영하지 않았습니다.
  • 이 계산은 새로 만들거나(CREATE INDEX) REINDEX 직후 상태를 가정합니다. 이후 무작위 위치에 계속 삽입되면 페이지 분할이 반복되며 실제 채움률이 이보다 낮아질 수 있습니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 9일 · 결과는 참고용 추정치입니다.