병렬적인 Data 처리는 , 대용량 데이터를 다룰 수 있게 해주며 Bandwidth의 증가로 인해 처리율을 높여준다. 병렬적인 DataBase의 아키텍처와 데이터 처리 방법에 대해 알아보자.
병렬성에 따른 성능 향상

병렬성이 증가할 수록
- 초당 TX 처리율은 높아진다.
- TX당 걸리는 시간은 같다.
병렬 머신 아키텍처

- Shared Memory 구조 : Memory를 공유한다.
- 병렬 DB와 공유된 메모리를 가진 구조.
- 각 프로세스는 자신의 disk를 가진다.
- 메모리 공유에 유리하다. ( IPC )
- 비싸다.
- ScaleUp이 어렵다.
- Shared Disk 구조 : Disk와 Processor를 공유한다.
- 각 프로세서가 자신만의 메모리를 가진다.
- client는 system의 모든 disk에 접근가능하다.
- Shared Nothing 구조 : 모든 것이 독립적이다.
- 각 client ( machine )가 자신만의 disk와 memory를 가진다.
- 프로그래밍이 어렵다
- 저렴하다.
- 쉽게 ScaleUp할 수 있다.
- network를 통한 communication

데이터 분할

데이터 베이스를 병렬적으로 나누었을 때 분할하는 방법에 따른 유불리가 존재한다.
- Range 방식으로 Partion ( 정렬 후 쪼개서 DB들에 저장 )
- 동등 join에 유리
- range query에 유리
- group-by에 유리
- Hash 방식 Partition
- Round Robin 방식 Partion ( 한 번씩 돌아가면서 저장 )
병렬 Scan
- 병렬적인 Scan을 하고, 결과를 Merge
- range 혹은 hash partition에 대해서는 모든 site를 scan할 필요가 없다.
- 각 site마다 index가 built될 수 있다.
병렬 Sorting
- 각 site마다 scan , 이후 sorting
- 결과값은 sorting되어있지만 , range-partitioned되어있다.
Data를 샘플링하여 분할 지점을 결정하여 불균형 문제를 해결한다.
병렬 Join
- Nested-Loop Join
Join되는 col에 대하여, 각 table의 모든 tuple을 비교한다.
Join되는 col에 대해 range partition되어있을 경우 유리하다.
- Sort-Merge Join
sorting으로 인한 range-partiton이 된다. 하지만, 불균형 문제 발생
병렬 Hash Join

- 해싱을 통해, 분산 partition
- 해시 조인을 실행
- 동등 조인에 유리하다
병렬 Query 최적화

What's wrong?

- 2phase 최적화가, 무조건 최적을 보장하는 것은 아니다.
- 반례
두 node에 대해 best serial plan이 best parellel plan이 아닐수도 있다.
- Table이 local two node로 partion되어있다.
- node 1에는 A~M까지 ( 99% )
- node 2에는 N~Z까지 ( 1% )
- node 1은 scan을 해야한다
- node 2는 secondary index를 사용해야한다
병렬 DB 요약
- 병렬성은 성능향상의 매우 좋은 도구이다
- Pipeline과 Partition을 통해 구현
- 대부분의 DB 연산 또한 병렬 DB에서도 가능하다