데이터베이스 테이블 크기 추정기 쉽게 이해하기 — 개념과 원리
큰 테이블을 만들기 전에 디스크가 대략 얼마나 필요한지 알아 두면 좋습니다. 이 추정기는 행 수에 평균 행 크기를 곱하고, 저장 페이지마다 비워 두는 공간을 반영한 뒤, 인덱스 몫을 비율로 더합니다. 데이터베이스 관리자와 개발자가 용량 계획, 인스턴스 저장소 선택, 백업·복제 용량 추정에 씁니다.
계산 방법
- 데이터 크기(GB) = 행 수 × 평균 행 바이트 ÷ (채움률 ÷ 100) ÷ 10⁹
- 인덱스 포함(GB) = 데이터 크기 × (1 + 인덱스 오버헤드 ÷ 100)
채움률(fill factor)은 각 페이지에서 행으로 채우는 비율이며 나머지는 빈 공간으로 둡니다. 크기는 십진 단위 GB(1GB = 10⁹바이트)입니다.
원리
관계형 데이터베이스는 행을 고정 크기 페이지에 저장합니다. PostgreSQL은 8kB, MySQL InnoDB는 기본 16KB입니다. 페이지는 수정에 대비해 일부러 여유를 두거나, 삭제와 페이지 분할 때문에 꽉 채워지지 않는 경우가 많습니다. 페이지의 90%만 데이터가 차 있다면 테이블은 원래 바이트의 1 ÷ 0.9 ≈ 1.11배 공간이 필요합니다. 인덱스는 보통 B-트리 구조로 따로 저장되며 인덱스 열 값과 각 행을 가리키는 포인터를 담습니다. 크기가 인덱스 개수와 키 너비에 따라 달라지므로 테이블 크기의 비율로 잡는 것이 실용적인 방법입니다.
예제 풀이
- 입력값은 10,000,000행, 행당 200바이트, 인덱스 오버헤드 50%, 채움률 90%입니다.
- 원시 데이터는 10,000,000 × 200 = 2,000,000,000바이트입니다.
- 채움률을 반영하면 2,000,000,000 ÷ 0.9 ≈ 2,222,222,222바이트, 곧 2.22GB입니다.
- 인덱스를 더하면 2.222 × 1.5 = 3.33GB입니다.
| 페이지 채움률 (%) | 데이터 크기 (GB) |
|---|---|
| 22.5 | 8.888888889 |
| 45 | 4.444444444 |
| 67.5 | 2.962962963 |
| 90 | 2.222222222 |
| 112 | 1.777777778 |
| 135 | 1.481481481 |
| 180 | 1.111111111 |
결과 해석
결과는 최소한의 출발점으로 보십시오. 실제 엔진은 행마다 추가 공간을 씁니다. PostgreSQL은 행마다 약 23바이트의 튜플 헤더와 4바이트 줄 포인터를 두며, 가변 길이 열과 정렬용 패딩도 더해집니다. 디스크는 데이터 증가, 임시 파일, 로그(WAL·redo), 테이블이나 인덱스를 다시 만드는 유지 보수 작업에 필요한 여유까지 고려해 잡아야 합니다.
흔한 실수
- 평균 저장 길이 대신 VARCHAR(255) 같은 선언된 최대 크기를 넣는 경우입니다.
- 행 헤더와 페이지 헤더를 빠뜨리는 경우입니다. 행이 좁을수록 영향이 큽니다.
- 정리 전까지 옛 행 버전을 남기는 엔진에서 수정·삭제로 생기는 팽창(bloat)을 무시하는 경우입니다.
자주 묻는 질문
채움률은 얼마로 하면 되나요?
PostgreSQL은 테이블 기본값이 100%, B-트리 인덱스가 90%입니다. 수정이 잦은 테이블은 채움률을 낮추면 도움이 될 수 있습니다.
실제 크기는 어떻게 확인하나요?
PostgreSQL은 pg_total_relation_size 함수로, MySQL은 information_schema.TABLES의 데이터·인덱스 길이로 확인합니다.
출처: PostgreSQL 공식 문서, "Database Page Layout" 및 CREATE TABLE 저장 매개변수(fillfactor) · MySQL Reference Manual, InnoDB 페이지 크기(innodb_page_size)