성능 데이터 모델링 수행 시 용량산정은 전체적인 DB에서 발생되는 트랜잭션의 유형과 양을 분석하는 자료가 됨
정확한 데이터 용량 산정시 디스크 사용 효율을 높일 수 있음
업무량이 집중된 디스크를 분리*설계하여 디스크 I/O[입출력] 부하를 분산시킬 수 있음
하나의 테이블에 대량의 데이터 발생시 문제점
아무리 설계가 잘된 데이터 모델이라도 하나의 테이블 및 하드웨어 공간에 대량의 데이터가 집약되어 있으면 성능 저하 발생 → 하나의 테이블에 대량의 데이터가 존재하면 인덱스의 Tree구조가 너무 커져 효율성이 떨어져 데이터를 처리[입력, 조회, 수정, 삭제]할 때 디스크 I/O를 많이 유발
SQL문장에서 데이터 처리를 위한 I/O의 양이 증가 → 칼럼이 많아지면 하나의 데이터를 물리적인 디스크의 여러 블록에 저장해야됨 → 데이터 처리시, 여러 블록에서 데이터를 I/O해야 해 SQL문장의 성능이 저하
인덱스를 생성할 때 인덱스 크기[용량]이 커지게 되어 인덱스를 찾아가는 단계가 깊어짐 [조회 성능 저하] → 너무 큰 인덱스의 Tree구조로 인해 효율성이 떨어져 데이터를 처리할 때 I/O를 많이 유발 → 인덱스 크기 증가에 따른 조회 성능 저하의 영향은 미미 → 데이터를 처리[입력/수정/삭제]하는 트랜잭션의 경우, 인덱의 특성상 일량이 증가해 더 많은 성능 저하 유발 → 데이터에 대한 범위 조회시 더 많은 I/O를 유발할 수 있음
대량의 데이터로 인한 대표적인 문제
로우 체이닝 [ROW CHAINING]
로우 마이그레이션 [ROW MIGRATION]
로우 길이가 너무 길어서 하나의 데이터 블록에 저장되지 않고두 개 이상의 데이터 블록에 걸쳐 하나의 로우가 저장되는 현상
데이터 블록에서 수정이 발생하면 늘어나는 저장공간으로 인해 수정된 데이터를 해당 데이터 블록에서 저장하지 못하고 다른 블록의 빈 공간을 찾아 저장하는 방식
ROW 정보 검색을 위해 하나 이상의 데이터 블록을 SCAN해야 하므로 성능이 저하됨
MIGRATION된 ROW를 읽기 전 기존 블록에서 헤더를 통해 MIGRATION된 ROW를 읽으므로 성능이 감소
* 블록 크기를 크게 만듦
* PCTFREE를 크게 설정 * 객체를 EXPORT하고 삭제한후, IMPORT * 객체를 MIGRATION하고 TRUNCATE
조회 업무를 수행할 때 하나의 테이블에 몰리기 때문에 트랜잭션을 분산 처리해야함 → 일반적으로 테이블 단위에서 분할의 방법을 적용
중첩된 루프[Nested Loop]
이중으로 for 문을 사용해서 비교하는 기능을 만들어야 조인 가능
데이터 양이 증가하면 비교해야 하는 건수도 증가 → 조인이 부하를 유발
이러한 비효율 문제를 해결하기 위해 인텍스와 옵티마이저가 있음 →반정규화를 수행하지 않고도 클러스터링, 응용프로그램, 인덱스 조정을 통해 성능 향상 가능
조인을 통해 성능이 저하되는 정규화의 문제점을 해결하기 위해반정규화를 하여 하나의 테이블에 저장 → 반정규화를 통해 칼럼이 계속 증가하면 조인이 최소화되므로 빠른 조회 가능 → 너무 많은 칼럼이 추가되면 한 개 행의 크기가 데이터베이스 관리 시스템의 입출력 단위인 블록의 크기를 넘게되는 문제 발생 ∴ 반정규화는 데이터를 중복시키기 때문에 또 다른 문제점을 발생시킴 → 반정규화에서 문제 발생하면 테이블을 분해하는 정규화를 통해 성능을 향상시킴
728x90
대량 데이터 발생에 따른 테이블 분할
대량의 데이터를 가진 테이블에서 트랜잭션이 발생될 때 테이블을 쪼개주면 디스크의 I/O가 감소하여 성능 개선
트랜잭션이 독립적으로 발생되는 경우 1:1관계로 분리 → 트랜잭션에 접근하는 칼럼유형을 분석해 자주 접근하는 칼럼과 상대적으로 접근 빈도가 낮은 칼럼 구분 → 분리된 테이블은 디스크에 이전보다 적은 칼럼이 저장되어 로우체이닝과 로우마이그레이션이 많이 줄어듦
데이터가 채워지지 않고 NULL상태로 존재하는 칼럼은 뒤쪽에 모아 로우 길이를 감소시킴 → 추후에 NULL상태의 칼럼에 데이터가 채워질 경우, 더 많은 로우 체이닝이 발생 → 사용빈도에 따라 나눈후 별도의 1:1관계 엔터티로 분리하는 등의 데이터모델 설계 수정을 고려하는 것이 좋
테이블에 대한 수평/수직 분할은 4가지 원칙을 적용해 결정 1> 데이터 모델링을 완성한다. 2> 데이터 베이스 용량을 산정한다. ※ 용량산정은 어느 테이블에 데이터의 양이 대용량이 되는지 분석하는 것 3> 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석한다. 4> 칼럼 단위로 집중화된 처리가 발생하는지, 로우 단위로 집중화된 처리가 발생하는지 분석해 집중화된 단위로 테이블을 분리하는 것을 검토
수평분할[Horizontal Partitioning]
레코드 개수가 많아 레코드를 기준으로 테이블을 분할하는 것
하나의 테이블에 데이터가 너무 많이 있고, 레코드 중 특정 범위만을 주로 엑세스하는 경우 사용
분할된 각 테이블은 서로 다른 디스크에 위치시켜 물리적인 디스크의 효용성을 극대화
DBMS차원에서의 수평 테이블 분할 방법에는 범위 분할, 해쉬분할, 복합 분할 등이 있음
수직분할[Vertical Partitioning]
칼럼의 개수가 많아 칼럼을 기준으로 테이블을 분할한 것
수직 분할이 일어나는 경우
조회 위주의 칼럼과 갱신 위주의 칼럼으로 나뉘는 경우 → 테이터 갱신 작업이 일어날 때 잠금[Locking]을 수행하므로 갱신 위주 칼럼들을 분할 → 데이터 무결성을 지키기 위해
특별히 자주 조회되는 칼럼이 있는 경우 → 별도의 테이블로 관리하면 조회되는 쿼리 작업의 성능이 향상됨
특정 칼럼 크기가 아주 큰 경우 → 텍스트 및 이미지와 같은 LOB[Large Objects] 데이터 형식을 지원
특정 칼럼에 보안을 적용해야 하는 경우 → 하나의 테이블 내에서 특정 칼럼들에게 SELECT,UPDATE,DELETE 등의 권한을 부여하지 않음 → 특정 칼럼에 대해 권한을 부여하기 위해 별도의 테이블 생성
파티션 기법[파티셔닝, Partitioning]
하나의 테이블에 많은 양의 데이터가 예상될 경우, 파티션을 사용해 테이블을 분할하는 기법
파티션을 사용하면논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 데이터 파일에 분산되어 저장됨 → 데이터 액세스 성능 향상, 데이터 관리 방법 개선 등의 장점이 있음 → 하나의 테이블에 많은 양의 데이터가 저장되어인덱스 추가, 테이블 분할 등을 해도 성능 저하될 때 사용
Range Partition
데이터 값의 범위를 기준으로 파티션을 수행
List Partition
특정한 값을 지정하여 파티션을 수행
Hash Partition
해시 함수를 적용해 파티션을 수행 → DBMS에서 스스로 분할하고 관리
Composite Partition
범위[Range Partition]와 해시[Hash Partition]를 복합적으로 사용해 파티션을 수행
댓글 영역