본문 바로가기

공부기록용

[ SQLD ] 데이터 모델과 성능 240806

( 테이블을 분할하는 반정규화 ) 테이블 분할 절차 ( 순서 )

- 데이터 모델링 수행

: 데이터 객체, 속성 그리고 관계를 다이어그램으로 ( ERD )

→ ERD를 기반으로 테이블 ( 릴레이션 ) 을 설계

-

데이터베이스 용량 산정

:  액세스 ( 접근 ) 하는 횟수가 적은 테이블은 분할을 고민할 필요가 없다.

해당 테이블이 미치는 성능이 미미하기 때문이다.

대량의 데이터가 처리되는 테이블이 있다면 → 성능 개선할 여지가 있는지 확인

무엇을 확인하냐면 ↓

 

- 대량 데이터가 처리되는 테이블에 대해 트랜잭션 처리 패턴 분석

: 주로 어떤 작업 ( 조회, 삽입, 수정, 삭제 등 ) 이 발생하는지 분석한다.

작업 패턴이 중구난방이라면 반정규화할 작업이 없다. 일정 패턴이 있는 경우

 

- 트랜잭션이 칼럼 단위로 집중되는 경우 테이블 을 수직 분할하고,

로우 단위로 집중되는 경우 테이블을 수평으로 분할한다.

 

정규화를 한다는 것은 정규형 수준이 높아진다는 것

반정규화를 한다는 것은 정규형 수준이 낮아진다는 것

 

반정규화_테이블 수평 분할

- 테이블이 많은 양의 데이터를 가질 것으로 예상되는 경우 → Partioning ( 파티셔닝 )

데이터베이스 행단위로 접근하는 트랜잭션 패턴이 많이 발생하는 경우 테이블을 수평으로 분할하고, 

수평 분할은 데이터베이스의 테이블 ( 릴레이션 ) 을 행 ( Row ) 단위로 나누는 것을 의미한다.

- Range Partition: 범위로 분할

- List Partition: 값으로 분할

- Hash Partition: 해쉬 함수 ( Hash Function ) 로 분할

→ 어떤 데이터를 다른 데이터로 바꿀 때: 임의의 길이의 데이터를 짧은 길이의 데이터로 매핑하는 함수

 

---------------------------------------------------------------------------------------------------------------------------

 

식별자, 비식별자 관계 표시

식별자 관계는 실선으로 표시하고, 비식별자 관계는 점선으로 표시한다.

 

---------------------------------------------------------------------------------------------------------------------------

 

Peter chen 방식에서 관계는 마름모로 나타낸다.

IE 방식에서 관계는 선으로 표시한다.

 

관계의 반정규화

테이블 개수는 변함이 없지만 관계가 늘어나는 경우 관계 추가다.

중복관계 추가: 조인을 통해 정보 조회가 가능하지만, 조인 경로 단축을 위해 중복관계를 추가함

 

반정규화 하기전 다른 방법을 검토할 수 있다.

인덱스 조정을 통해 성능 향상을 유도할 수 있다.

인덱스 ( Index )

 

Select 학번, 이름, 학년 → 테이블에 대해서 세로로 ( 컬럼을 기준으로 ) 필터링From 학생WHERE 학번 > 3000 and 학번 < 5000 → 테이블에 대해서 가로로 ( Row 를 기준으로 ) 필터링

 

기본적으로 관계형 데이터베이스 테이블에서는 레코드가 저장되는 순서가 무작위다 → 정렬이 안되어 있다.그래서 어떤 값을 얻기 위해서는 테이블을 전체를 살펴봐야 하는데 이를 Full Scan 이라고 하고,Full Scan 시 데이터를 전부 살펴봐야 하기 때문에 시간이 많이 걸리고, 여기서 성능을 향상시키고자 만든 장치가 인덱스다.

→ Full Scan 의 경우 인덱스를 사용하면 성능을 향상시킬 수 있다.

 

학번을 가지고 검색 ( 조회 ) 하는 작업이 빈번하게 발생하는데

학번이 정렬이 안되어 있기 때문에 찾는데 시간이 많이 소요된다면

학번으로 인덱스를 하나 만든다 → 인덱스 테이블에 학번을 정렬해서 넣는다.

정리하자면 인덱스는 검색 속도의 향상을 위한 기술이다 → 실제 테이블을 Full Scan ( 전부 살펴보기 ) 하지 않고, 인덱스 테이블을 검색하는데 지나치게 많은 인덱스 생성시 시간 및 공간을 낭비하게 된다 → 인덱스된 필드의 업데이트시 시간이 증가하게 된다.

컬럼에 인덱스가 자동 생성되는 경우는 PK 또는 Unique 조건을 주는 경우고,

Unique 하지 않고 PK도 아닌 컬럼에 Create Index 구문 사용으로 수동으로 인덱스를 생성할 수 있다.

 

인덱스의 스캔 구조 이해

PK의 속성 순서대로 인덱스가 정렬이 되어있다.

조회의 조건으로 더 많이 사용될 것 같은 속성을 PK의 앞으로 정렬을 한다 → 인덱스의 스캔 속도가 빨라진다.

→ PK 에는 인덱스가 ( 자동으로 ) 설정되어 있는데, PK 의 인덱스가 복합 식별자일 때 속성의 순서를 잘 바꿈으로써 성능을 향상시킬 수 있다. 속성의 순서를 잘 바꾼다는 것은 상기 언급한 조회의 조건으로 더 많이 사용될 것 같은 속성을 PK의 앞으로 정렬한다는 것이다.

 

FK는 인덱스가 자동으로 설정되지 않지만 수동으로 설정할 수 있고, ( FK 로 조회를 할 경우가 많을 경우 ) FK 에 인덱스를 설정함으로써 성능을 향상시킬 수 있다.

 

정규화는 반드시 필요한데, 정규화를 조금 포기하더라고 성능을 향상시킬 수 있는 여지가 있지 않을까를 고려한 것이 반정규화고,

반정규화외에 성능을 향상시킬 수 있는 방법이 여러 개 있는데 그 중 하나가 인덱스다.

 

참고 강의

[ 유튜브 ] 데이터베이스실무(SQLD대비) | 김남규 교수

 

'공부기록용' 카테고리의 다른 글

[ SQLD ] SQL_Basic DML 240814  (0) 2024.08.15
[ SQLD ] SQL_Basic DML 240810  (0) 2024.08.10
[ Spring Boot ] 스프링 JPA  (0) 2024.08.02
[ SQLD ] 실습 240802  (0) 2024.08.02
[ MYSQL ] SELECT절과 WHERE절 실습  (0) 2024.08.01