대용량 데이터의 성능 저하 원인
테이블에 저장되는 데이터의 양이 많거나 컬럼의 수가 많은 경우에는 데이터베이스의 성능 저하가 발생할 수 있다. 성능 저하의 주된 원인은 데이터의 양이 많아지면서 인덱스의 용량이 커져서, 인덱스 변경이 필요한 입력, 수정, 삭제 등 트랜잭션에서 성능 저하가 발생한다.

이외에도 컬럼의 수가 많아지면서, 데이터가 다수 블록에 저장되므로, 다수의 I/O를 발생시켜 성능 저하가 발생하는데 이때 크게 두 가지 현상이 발생한다.
- 로우 체이닝(Row Chaining)
하나의 데이터 행(Row)이 여러 블록에 걸쳐 저장되는 현상을 말한다. 일반적으로 데이터 행은 하나의 블록에 저장되지만, 데이터가 증가하여 블록 내에 행을 저장할 수 있는 공간이 부족할 경우 행이 여러 블록으로 분산된다. 이로 인해 데이터를 읽는 과정에서 여러 블록을 탐색해야 하므로 성능 저하가 발생한다.

- 로우 마이그레이션(Row Migration)
데이터에 대한 수정이 발생할 때, 기존 블록이 아닌 새로운 블록에 저장하는 현상을 의미한다. 행이 이동되면 원래 블록에는 행에 대한 포인터가 남아 있어, 이 포인터를 따라 새 블록으로 이동해야 하기 때문에 쿼리 성능이 저하된다.

이번 글에서는 이와 같은 대용량 데이터의 성능을 최적화할 수 있는 방법에 대해 이해해보고자 한다.
대용량 데이터의 성능 향상 방법
대용량 데이터를 효과적으로 관리하기 위한 중요한 방법은 크게 두 가지가 존재한다.
- 파티셔닝
테이블을 여러 개의 작은 단위로 나누어 저장하는 방법으로, 데이터의 접근성과 관리 효율성을 크게 향상시킬 수 있다. 즉, 부하를 각 파티션으로 분산시켜 성능을 향상시키는 방법이다.
- 테이블 분할
하나의 테이블을 다수의 테이블로 분할하여, I/O를 줄이고 성능을 향상시키는 방법이다.
파티셔닝(Partitioning) 유형

- 리스트 파티셔닝(List Partitioning)
파티션에 값 목록을 할당해서 데이터를 분할하는 기법이다. 특정 카테고리나 그룹에 따라 데이터를 나눌 수 있으며, 명확하게 구분된 범주가 존재할 때 유용하다.
- 레인지 파티셔닝(Range Partitioning)
파티션 키 값의 범위를 기준으로 파티션을 구분하는 기법이다. 값의 범위 또는 기간에 따른 데이터 조회와 보관, 삭제가 용이하다는 장점이 있다.
- 해시 파티셔닝(Hash Partitioning)
해시 함수를 이용해 데이터를 분할하는 기법이다. 이 방법은 데이터의 고른 분포를 보장하는 데 유리하며, 특정한 규칙 없이 데이터를 균등하게 분산하고자 할 때 사용한다. 주로 임의의 데이터 조회나 삽입에 효율적인 성능을 제공한다.
- 컴포지트 파티셔닝(Composite Partitioning)
1-3번의 방법 중 두 가지 이상의 파티셔닝 방법을 결합한 방법을 의미한다.
테이블 분할 유형
- 수평 분할

하나의 테이블을 다수의 테이블로 분할할 때 수평(Row)를 기준으로 분할하는 기법이다. 특정 부분에 읽는 데이터의 양이 많을 때 주로 사용하는 방법이다. 하지만, 하나의 서버가 고장나면 데이터의 무결성이 깨질 수 있다는 점과, 데이터를 찾는 과정이 기존보다 복잡하기 때문에 latency가 증가한다는 단점이 존재한다.
- 수직 분할

하나의 테이블을 다수의 테이블로 분할할 때 수직(Column)을 기준으로 분할하는 기법이다. 데이터를 읽을 때 불필요한 정보까지 읽는 것을 방지하여 I/O를 줄이는 효과를 얻을 수 있다. 한 테이블을 SELECT하면 결국 모든 컬럼을 메모리에 올리게 되는데, 필요 없는 컬럼을 줄일 수 있다.
결론
대용량 데이터베이스의 성능을 최적화하기 위해 로우 체이닝, 로우 마이그레이션을 최소화하고, 파티셔닝과 테이블 분할 기법을 적절히 활용하는 것은 매우 중요하다. 데이터의 특성과 사용하는 패턴 등을 고려한 설계와 운영 전략을 통해 데이터베이스의 성능을 최적화하는 과정이 필요하다. 이를 통해 데이터의 접근 속도를 향상시키는 것은 서비스의 안정성과 효율성을 증가시키는 방법 중 하나라고 생각한다.