Skip to content

테이블분할

한 테이블에 대량의 데이터가 저장된다면, 용량(storage)의 한계와 성능(performence)의 저하가 발생한다.

수평/수직 분할 설계는 테이블 구조를 행또는 열을 기준으로 분할함으로써 로우체이닝, 로우마이그레이션 등의 성능 저하를 예방하는 기법이다.

현상설명
로우체이닝
(Row Chaining)
Row의 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고, 2개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태이다. 하나의 행을 읽을 때 여러개의 데이터 블록을 읽어야 하기 때문에 과정에서 성능이 저하된다.
로우 마이그레이션
(Row Migration)
데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록해서 저장하지 못하는 것을 의미한다.

수평분할(Sharding)

수평분할은 테이블을 행 단위로 분할하여 Input/Output을 감소시키는 방법이다.

수평분할의 대표적인 기법으로는 행을 데이터의 값 범위를 기준으로 나누는 Range Partitioning과 PK를 모듈러 연산한 결과로 DB를 특정하는 Modular Partitioning, 해시값을 기준으로 나누는 Hash Partitioning 세가지가 있다.

수직분할

칼럼이 많은 테이블의 컬럼을 조회하면 그 테이블에 있는 모든 칼럼을 읽게되고, 그 중 조회대상이 아닌 칼럼은 버려지게 되어 불필요한 블록 I/O와 Disk I/O의 수가 많아진다.

이 경우 테이블을 수직분할을 통해 성능을 향상시킬 수 있다. 같은 트랜잭션 안에서 동시에 조회되는 경우가 많은 컬럼들, 또는 수정이 자주 발생되는 컬럼들을 모아 1:1 관계로 별도의 테이블을 만드는 식으로 수행한다.

블록 I/O에 소요되는 시간이 join을 하는 것 보다도 오래 걸릴 정도로 컬럼 수가 극단적으로 많은 경우에 좋은 효과를 볼 수 있다.