상세 컨텐츠

본문 제목

[개미의 걸음 SQLD 1과목] 성능 데이터 모델링 ② 용량산정 & 대용량 데이터 문제

자격증/SQLD

by IT개미 데이터 2020. 12. 11. 07:07

본문

728x90

용량산정

성능 데이터 모델링 수행 시 용량산정은 전체적인 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

대량 데이터 발생에 따른 테이블 분할

출처 : DBGUIDE.NET

  • 대량의 데이터를 가진 테이블에서 트랜잭션이 발생될 때 테이블을 쪼개주면 디스크의 I/O가 감소하여 성능 개선
  • 트랜잭션이 독립적으로 발생되는 경우 1:1관계로 분리
        → 트랜잭션에 접근하는 칼럼유형을 분석해 자주 접근하는 칼럼과 상대적으로 접근 빈도가 낮은 칼럼 구분
        → 분리된 테이블은 디스크에 이전보다 적은 칼럼이 저장되어 로우체이닝과 로우마이그레이션이 많이 줄어듦
  • 데이터가 채워지지 않고 NULL상태로 존재하는 칼럼은 뒤쪽에 모아 로우 길이를 감소시킴
        → 추후에 NULL상태의 칼럼에 데이터가 채워질 경우, 더 많은 로우 체이닝이 발생
        → 사용빈도에 따라 나눈후 별도의 1:1관계 엔터티로 분리하는 등의 데이터모델 설계 수정을 고려하는 것이 좋
  • 테이블에 대한 수평/수직 분할은 4가지 원칙을 적용해 결정
        1> 데이터 모델링을 완성한다.
        2> 데이터 베이스 용량을 산정한다.
                ※ 용량산정은 어느 테이블에 데이터의 양이 대용량이 되는지 분석하는 것
        3> 대량 데이터가 처리되는 테이블에 대해서 트랜잭션 처리 패턴을 분석한다.
        4> 칼럼 단위로 집중화된 처리가 발생하는지, 로우 단위로 집중화된 처리가 발생하는지 분석해 집중화된 단위로 테이블을 분리하는 것을 검토

수평분할[Horizontal Partitioning]

출처 : DBGUIDE.NET

 

레코드 개수가 많아 레코드를 기준으로 테이블을 분할하는 것

  • 하나의 테이블에 데이터가 너무 많이 있고, 레코드 중 특정 범위만을 주로 엑세스하는 경우 사용
  • 분할된 각 테이블은 서로 다른 디스크에 위치시켜 물리적인 디스크의 효용성을 극대화
  • DBMS차원에서의 수평 테이블 분할 방법에는 범위 분할, 해쉬분할, 복합 분할 등이 있음

수직분할[Vertical Partitioning]

출처 : DBGUIDE.NET

칼럼의 개수가 많아 칼럼을 기준으로 테이블을 분할한 것

  • 수직 분할이 일어나는 경우
    조회 위주의 칼럼과 갱신 위주의 칼럼으로 나뉘는 경우
        → 테이터 갱신 작업이 일어날 때 잠금[Locking]을 수행하므로 갱신 위주 칼럼들을 분할
        데이터 무결성을 지키기 위해
    특별히 자주 조회되는 칼럼이 있는 경우
        별도의 테이블로 관리하면 조회되는 쿼리 작업의 성능이 향상됨
    특정 칼럼 크기가 아주 큰 경우
        텍스트 및 이미지와 같은 LOB[Large Objects] 데이터 형식을 지원
    특정 칼럼에 보안을 적용해야 하는 경우
        하나의 테이블 내에서 특정 칼럼들에게 SELECT,UPDATE,DELETE 등의 권한을 부여하지 않음
        특정 칼럼에 대해 권한을 부여하기 위해 별도의 테이블 생성

 

파티션 기법[파티셔닝, Partitioning]

하나의 테이블에 많은 양의 데이터가 예상될 경우, 파티션을 사용해 테이블을 분할하는 기법

  • 파티션을 사용하면 논리적으로는 하나의 테이블이지만 물리적으로는 여러 개의 데이터 파일에 분산되어 저장
        → 데이터 액세스 성능 향상, 데이터 관리 방법 개선 등의 장점이 있음
        → 하나의 테이블에 많은 양의 데이터가 저장되어 인덱스 추가, 테이블 분할 등을 해도 성능 저하될 때 사용
Range Partition 데이터 값의 범위를 기준으로 파티션을 수행
List Partition 특정한 값을 지정하여 파티션을 수행
Hash Partition 해시 함수를 적용해 파티션을 수행
    → DBMS에서 스스로 분할하고 관리
Composite Partition 범위[Range Partition]와 해시[Hash Partition]를 복합적으로 사용해 파티션을 수행

# Range Partition

더보기
출처 : DBGUIDE.NET
  • 요금과 관련된 1억 2천만 건의 대용량 데이터를 처리하기 위해 월별로 12개의 파티션 테이블 생성
        → 요금 특성상 월단위 데이터 처리를 하는 경우가 많으므로
  • 월별로 데이터를 저장하므로 데이터 보관주기에 따라 쉽게 삭제 가능

# LIST PARTITION

더보기

지점, 사업장 코드값 등으로 PK가 구성된 테이블에서 대량의 데이터 처리시에는 LIST PARTITION 적용

출처 : DBGUIDE.NET
  • 고객 관련 1억건의 대용량 데이터를 처리하기 위해 지역을 나타내는 사업소코드별로 LIST PARTITION 적용
  • 대용량 데이터를 특정값에 따라 분리 저장 가능
  • RANGE PARTITION과 같이 데이터 보관주기에 따라 쉽게 삭제하는 기능은 제공하지 않음

 

파티션 인덱스[Partition Index]

Global Index 여러 개의 파티션에서 하나의 인덱스를 사용
Local Index 해당 파티션 별로 각자의 인덱스를 사용
Prefixed Index 파티션 키와 인덱스 키가 동일
Non Prefixed Index 파티션 키와 인덱스 키가 다름

 

728x90

관련글 더보기

댓글 영역