본문 바로가기
관리자

Programming-[Backend]/SQL

[SQLD] 4. 반정규화와 분산데이터베이스

728x90
반응형

 

반정규화(De-Normalization)

 

 

반정규화는 데이터베이스의 성능 향상을 위해서 데이터 중복을 허용하고 조인을 줄이는 방법이다.

 

반정규화 수행 시점

  • 정규화에 따라 수행 속도가 느려지는 경우*
  • 다량의 범위를 자주 처리해야하는 경우
  • 특정 범위의 데이터만 자주 처리하는 경우
  • 요약/집계 정보가 자주 요구되는 경우

반정규화는 클러스터링, 뷰, 인덱스 튜닝, 파티션 등 대안이 있는지 확인 후에 진행한다.

 

*정규화를 수행하면 여러 테이블로 쪼개지고, 이에 따라 데이터를 조회할 때 조인을 사용해야한다. 조인은 단순한 코딩으로 치환하여 생각하면 이중 for문을 작성하는 것과 같다. 따라서 반정규화를하여 2개 테이블을 1개 테이블로 만들면 조인이 필요없게 되며 수행 속도의 향상이 있을 수 있다.**

 

**하나의 테이블에 너무 많은 컬럼이 추가되면 한 개 행의 크기가 데이터베이스 관리 시스템의 입출력 단위인 블록 크기(Block Size)를 넘어서게 된다. 이러면 1개 행을 조회하기 위해 여러 블록을 읽어야되서 성능이 문제가 될 수 있다.

 

 

※ 클러스터링(Clustering) : 인덱스 정보를 저장할 때, 물리적으로 정렬해서 저장하는 방법이다. 조회 시에 인접 블록을 연속적으로 읽을 수 있어 성능이 향상될 수 있다.

 

 

반정규화 기법

 

1) 계산된 컬럼 추가

통계성 정보가 자주 요구되는 경우 컬럼 내에 총 판매액, 평균 잔고 등 집계 결과값을 하나의 컬럼으로 미리 넣어놓는 방식이다. 보통 배치 프로그램 등을 이용하여 이런 정보들을 테이블에 입력한다.

 

 

2) 테이블 수직분할(참조1)

| 기본키 | 속성1 | 속성2 | 속성3 -> | 키본키 | 속성1 | + | 기본키 | 속성2 | + | 속성3 | 과 같이 수직으로 분할하는 것을 의미한다.

 

  • 갱신 위주 분할: 데이터 갱신 시 DB lock이 걸린다. 따라서 자주 갱신이 일어나는 속성들이 있다면 이 속성들만 수직분할하는 것이 유리할 수 있다.
  • 높은 조회 빈도 속성 분할: 일부 속성만 매우 자주 조회된다면, 그 속성들을 수직분할 하는게 좋을 수 있다.
  • 크기가 큰 속성 분할: 이미지나 2GB 이상 저장될 수 있는 텍스트 형식 속성등을 수직분할한다.
  • 보안 속성 분할: 특성 속성에만 보안 적용이 필요한 경우 수직분할하여 테이블에 보안을 적용한다.

 

3) 테이블 수평분할(참조1)

하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법이다. 레코드별로 사용 빈도의 차이가 큰 경우 사용 빈도에 따라 테이블을 분할한다.

참조 2.의 그림

데이터 개수가 적어지므로 인덱스의 개수도 작아지고 성능이 향상될 수 있다. 다만, 만약 여러 테이블을 각각의 DB로 분할하여 저장(샤딩, Sharding)하는 경우 서버간의 연결과정 증대로 latency 발생, 1개의 서버 장애 시 데이터 무결성 유지 불가 등의 단점이 발생할 수 있다.

 

 

4) 테이블 병합

여러 테이블에서 동시에 데이터가 요청되어 조인이 많이 발생하는 경우에는 하나의 테이블로 합쳐서 사용하는 것이 성능 향상에 유리할 수 있다.

테이블 통합 시 고려사항은 다음과 같다.

  • 데이터 검색은 쉽지만, 레코드 증가로 처리량이 증가한다.
  • 입력, 수정, 삭제 규칙이 복잡해질 수 있다.
  • Null, Default 등의 제약 조건을 설계하기 어렵다.

테이블간 1대 1, 1대 N, 슈퍼타입-서브타입 관계가 있을 수 있다. 1대 1, 슈퍼타입-서브타입 관계에서는 주로 테이블 병합이 유리하게 작용하는 부분이 클 수 있으나, 1대 N 관계의 테이블을 병합하면 많은 양의 데이터 중복이 발생할 수 있다.

 

 

파티셔닝(partitioning) - 참조2

반정규화에서의 수직, 수평 테이블 분할과 동일한 개념이다. 파티션을 사용하면 논리적으로는 하나의 테이블이지만 여러 개의 데이터 파일에 분산하여 데이터를 저장하게 된다.

 

  • 범위 분할(Range Partition) : 데이터 값의 범위를 기준으로 분할한다. 예를 들어 우편번호를 기준으로 분할 키로 설정하여, 수평 분할할 수 있다.
  • 목록 분할(List Partition) : 특정값을 기준으로 분할한다. 예를 들어 Country 컬럼이 Iceland, Norway, Finland, Denmark 중 하나에 해당되면 북유럽 국가로 파티셔닝할 수 있다.
  • 해시 분할(Hash Partition) : 해시 함수를 적용하여 파티션을 수행한다. 예를 들어 4개의 파티션으로 분할할려고 한다면, 해시함수에 분할키에 해당하는 값을 넣었을 때, 0~3에 대한 해시값을 반환한다. 이후 이 해시값에 맞게 테이블을 파티셔닝하는 것이다.
  • 합성 분할(Composite Partition) : 범위와 해시를 복합적으로 사용하여 분할한다. 예를 들어 범위 분할을 먼저 수행하고, 해시 분할을 할 수 있다.

 


 

분산 데이터베이스

 

분산 데이터베이스는 한 곳의 물리적인 데이터베이스에 데이터를 담는 것이 아니라, 여러 데이터베이스에 데이터들을 나눠놓고 논리적으로는 마치 한 곳의 데이터베이스에서 데이터를 가져다 쓰는 개념이다. 빠른 네트워크 환경이 뒷받침이 되어 데이터베이스를 분산시켜 사용성 및 성능 향상을 꾀하는 방법이다.

 

 

분산 데이터베이스 투명성

분산 데이터베이스는 6가지 투명성(Transparency)을 만족해야한다.

 

분할 투명성 고객은 하나의 논리적 릴레이션이 여러 단편으로 분할되어 각 단편의 사본이 여러 시스템에 저장되어있음을 인식할 필요가 없다.
위치 투명성 - 고객이 사용하려는 데이터의 저장 장소를 명시할 필요가 없다.
- 고객은 데이터가 어느 위치에 있더라도 동일한 명령을 사용하여 데이터에 접근할 수 있어야 한다.
지역 사상 투명성 지역 DBMS와 물적 데이터베이스 사이의 사상이 보장됨에 따라 각 지역 시스템 이름과 무관한 이름이 사용가능하다.
중복 투명성 데이터베이스 객체가 여러 시스템에 중복되어 존재함에도 고객과는 무관하게 데이터의 일관성이 유지된다.
장애 투명성 데이터베이스가 분산되어 있는 각 지역의 시스템이나 통신망에 이상이 발생해도, 데이터의 무결성은 보장된다.
병행 투명성 여러 고객의 응용 프로그램이 동시에 분산 데이터베이스에 대한 트랜잭션을 수행하는 경우에도 결과에 이상이 없다.

 

 

분산 데이터베이스의 장단점

 

참조3에 따르면 분산 데이터베이스의 장단점은 아래 표와 같다. 

 

 

 


참조

 

0. [도서] 영진닷컴 - SQL 개발자 이론서 + 기출문제

 

1. 기록공간 블로그

https://lipcoder.tistory.com/337

 

 

2.블로그 - DB 파티셔닝이란

https://gmlwjd9405.github.io/2018/09/24/db-partitioning.html

 

 

3. 데이터 온에어 - 분산 데이터베이스와 성능

https://dataonair.or.kr/db-tech-reference/d-guide/sql/?mod=document&uid=336

 

 

728x90
반응형