한 테이블에 대량의 데이터가 저장된다면, 용량(storage)의 한계와 성능(performence)의 저하가 발생한다.
수평/수직 분할 설계는 테이블 구조를 행또는 열을 기준으로 분할함으로써 로우체이닝, 로우마이그레이션 등의 성능 저하를 예방하는 기법이다.
현상 | 설명 |
---|---|
로우체이닝 (Row Chaining) |
Row의 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고, 2개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태이다. 하나의 행을 읽을 때 여러개의 데이터 블록을 읽어야 하기 때문에 과정에서 성능이 저하된다. |
로우 마이그레이션 (Row Migration) |
데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록해서 저장하지 못하는 것을 의미한다. |
수평분할은 테이블을 행 단위로 분할하여 Input/Output을 감소시키는 방법이다.
수평분할의 대표적인 기법으로는 행을 데이터의 값 범위를 기준으로 나누는 Range Partitioning과 PK를 모듈러 연산한 결과로 DB를 특정하는 Modular Partitioning, 해시값을 기준으로 나누는 Hash Partitioning 세가지가 있다.
칼럼이 많은 테이블의 컬럼을 조회하면 그 테이블에 있는 모든 칼럼을 읽게되고, 그 중 조회대상이 아닌 칼럼은 버려지게 되어 불필요한 블록 I/O와 Disk I/O의 수가 많아진다.
이 경우 테이블을 수직분할을 통해 성능을 향상시킬 수 있다. 같은 트랜잭션 안에서 동시에 조회되는 경우가 많은 컬럼들, 또는 수정이 자주 발생되는 컬럼들을 모아 1:1 관계로 별도의 테이블을 만드는 식으로 수행한다.
블록 I/O에 소요되는 시간이 join을 하는 것 보다도 오래 걸릴 정도로 컬럼 수가 극단적으로 많은 경우에 좋은 효과를 볼 수 있다.