하나의 테이블에 대량의 데이터가 존재하는 경우 : 인덱스의 트리 구조가 너무 커져 효울성이 떨어져 데이터를 처리(입력, 수정, 삭제, 조회)할 때 디스크 I/O를 많이 유발하게 된다. 또한, 인덱스를 생성 할 때 인덱스의 크기가 커지게 되고 그렇게 되면 인덱스를 찾아 가는 단계가 깊어서져서 조회 성능이 저하된다. 조회시에 인덱스의 크기가 다른 트랜잭션에 비해 성능 저하가 작지만 입력, 수정, 삭제하는 트랜잭션의 경우 인덱스의 특성상 성능 저하를 유발할수 있다.
하나의 데이블에 많은 수의 칼럼이 존재 : 데이터가 여러블록에 존재하므로 인해 디스크에서 데이를 읽는 I/O 량이 많아 지게 되어 성능이 저하 된다. 또한, 물리적인 디스크에 여러 블록에 데이터가 저정되게 된다. 따라서 데이터를 처리할 때 여러 블록에서 데이터를 I/O 해야 된다는 단점이 있다.
로우 길이가 너무 긴 경우 : 로우 체이닝과 로우 마이그레이션이 발생하여 많은 블록에 데이터가 저장되면, 데이터 베이스 메모리에서 디스크와 입출력이 발생 할때 불필요하게 입출력이 많이 발생한다.
로우체이닝(Row Chaining) : 로우 길이가 너무 길어서 데이터 블록 하나에 데이터가 모두 저장되지 않고 두 개 이상의 블록에 걸쳐 하나의 로우가 저장되어 있는 형태
로우마이그레이션(Row Migration): 데이터 블록에서 수정이 발생하면 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
이때 어느 칼럼에 대해 집중적으로 발생하는지 분석하여 테이블을 쪼개어 주면 디스크 인풋아웃풋이 감소하게 된다.
도서정보 테이블에서는 전자출판유형에 대한 트랜잭션이 독립적으로 발생이 되는 경우가 많고 대체제품에 대한 유형의 트랜잭션이 독립적으로 발생되는 경우가 만이 있어 1:1 관계로 분리하였다. 분리된 테이블은 디스크에 적어진 칼럼이 저장이 되므로 로우마이그레이션과 로우체이닝이 많이 줄어들 수 있다. 따라서 성능이 개선될 수 있다.
많은 수의 칼럼을 가지는 테이블은 실전에서도 많이 보게 되는데 이 때, 트랜잭션을 분석하여 적절하게 1:1 관계로 분리함으로써 성능향상이 가능하도록 해야한다.
테이블에 많은 양의 데이터가 예상될 경우 파티셔닝을 적용하거나 PK에 의해 테이블을 분할하는 방법을 적용할 수 있다
위에 경우는 요금이라는 테이블을 파티션닝한 경우이다. 이 기법은 range partition 이고 가장 많이 사용되는 파티셔닝 기능이다. 대상 테이블을 날짜 또는 숫자값으로 분리가 가능하고 각 영역별로 트랜잭션이 분리 된다면 가능하다. 또한 데이터 보관주기에 따라 쉽게 지우는게 가능하다.
위에 경우는 사업소 코드별로 list partition를 적용한 사례이다. 이는 대용량 데이터를 특정값에 따라 분리하여 저장할 수 있으나 range partition 과 같이 삭제가 용이하진 않다.
테이블에 대한 수평분할 / 수직분할의 절차
컬럼수가 많다면 1:1형태로 분리, 컬럼수는 작고 데이터가 많은 경우 파티셔닝 검토
출처: https://eehoeskrap.tistory.com/56 [Enough is not enough:티스토리]