Row Oriented Database
- 디스크에 테이블이 Rows로 저장됩니다.
- 하나의 IO block read는 테이블에서 여러개의 Rows를 읽어옵니다.
- 특정 Row를 찾으려면 많은 양의 IO가 필요합니다.
예시
일반적으로 우리가 사용하는 Row-Oriented Database의 예시입니다.
사용자 입장에서는 위와 같이 보일 텐데 이를 실제 디스크에 저장한다면 아래와 같은 예시로 저장될 것입니다.
회색은 하나의 block 에 있는 데이터를 의미하고 빨간 세로선 3개로 해당 Row가 끝났음을 명시했습니다.
검색 예시
Select first_name from emp where ssn=666
을 실행하면 아래와 같이 순서대로 페이지들을 검색합니다.
1번 block -> 없음
2번 block -> 없음
3번 block -> 있음
합 연산의 예시
Select sum(salary) from emp
각 Row의 salary의 합을 계산하기 위한 쿼리입니다.
이 연산은 모든 Block에 대한 IO를 요청합니다.
아래와 같이 1001부터 1008까지 모든 데이터를 요청하게 됩니다.
salary 뿐만 아니라 실제로 사용에 필요없는 row_id, id, name 등 연산에는 필요 없는 모든 정보를 다 가져오게 되죠.
Row-Oriented Database는 이런식으로 동작합니다.
Column-Oriented Database
- 테이블은 column first로 저장됩니다.
- 하나의 IO block read는 여러 column을 테이블에서 읽어 옵니다.
- 특정 Column에 대한 값을 가져오는데 적은 IO가 필요합니다.
- 하지만, 여러개의 column을 작업하는데는 더 많은 IO가 필요합니다.
- OLAP에 주로 사용합니다. (온라인 분석 처리)
예시
Row-Oriented Database와 같은 예시로 동작을 확인해보겠습니다.
실제 데이터베이스에 아래와 같이 저장됩니다.
각 Column과 관련된 값의 순서로말이죠.
따라서, row_id는 매 Column마다 존재합니다.
이런 경우에는 당연히 데이터의 수정이 매우 괴로울것이 예상되죠
하나의 데이터를 삭제/수정하면 모든 IO block에 대한 작업이 필요하기 때문입니다.
그러면 실제 연산을 어떻게 하는지 확인해보겠습니다.
검색 예시
Select first_name from emp where ssn=666
동일한 검색 예시를 해보겠습니다.
1. 먼저 ssn을 기준으로 block을 검색합니다. (X, V 표시)
첫번째 block에는 666이 없지만 (X), 두번째 block에는 ssn=666인것을 찾았습니다. (V)
2. 찾은 row id를 사용하여 first_name을 찾을 수 있습니다 (빨간 화살표)
FAQ : 어떻게 첫번째 block을 넘기고 2번째 block의 Yan을 찾았냐는 질문을 할 수 있는데 Database 내에는 metadata를 사용한 특정 block을 찾을 수 있는 효율적인 동작을 위한 기능들이 있다고 생각을 하면 될거같습니다.
여기서는 검색의 효율이 높아보입니다.
다만, 다른 검색에서는 효율이 어떻게 될지 보면 좋을것 같네요.
검색 예시 2
Select * from emp where id = 1
이 예시에서는 아래와 같이 동작합니다.
1. id = 1인 row_id를 찾습니다.
2. 모든 Column block에서 row_id=1인 값을 가져옵니다. (거의 모든 block에서 IO read가 필요합니다.)
Column-Oriented Database 연산의 끔찍한 점이 이와 같습니다.
다만, 당연히 좋은 점이 있습니다.
합 연산 예시
Select sum(salary) from emp
Row-oriented Database에서는 각 페이지들을 다 읽어서 Salary만 계산하는 과정이 추가로 필요했습니다.
반면, 아래와 같이 Column-Oriented Database는 하나의 column에 대한 데이터만 읽어와서 합치면 됩니다!
따라서, 이런 연산에서 강점이 있습니다.
결론적으로 Row-Oriented 와 Column-Oriented Database를 비교하면 아래와 같습니다.
Row-Oriented Database | Column-Oriented Database |
Row-Based 저장 | Column-based 저장 |
read/write에 대해서 최적이다. | Write가 느리다. |
OLTP (온라인 트랜잭션 처리) | OLAP (온라인 분석 처리) |
압축이 효율적이지 않음. | 압축이 효율적임 |
Aggregation이 효율적이지 않음. | Aggregationo이 효율적임 |
Multi-column에 대한 query가 효율적 | Multi-column에 대한 query가 비효율 |
'CS 지식 > 데이터베이스 기본 다지기' 카테고리의 다른 글
Transaction 과 ACID (0) | 2024.10.06 |
---|
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.