본문 바로가기
DBMS/Vertica

Projection (프로젝션, 데이터 저장소)

by yororing 2024. 6. 13.

00 개요

  • 회사에서 코드분석 하는데 VIEW를 만들길래 이것이 뭔가 하고 정리하고자 함

01 Projection이란

1. Projection 정의 (테이블과 프로젝션)

  • Vertica의 테이블은 논리적인 구조를 정의 할 뿐 데이터를 저장하고 있지 않으며, 데이터를 저장하는 곳은 Projection이라는 물리적인 구조임
  • 테이블당 복수 개의 projection을 생성 가능
  • 전체 컬럼을 가지는 projection이 반드시 하나 존재해야 하며(super projection), 테이블의 컬럼을 일부만 가지고 projection도 생성 가능
  • 또한 테이블과 다른 정렬순서로 데이터를 저장 가능
    • 정렬은 항상 ASC(오름)로 정렬됨
    • 버티카에서는 table을 anchor table이라고 부르기도 함

2. Projection 생성되는 시기

  • Vertica에서 Projection이 생성되는 시기는 다음과 같은 경우에 자동 / 명시적으로 생성됨
    • 테이블 생성 후 처음으로 데이터가 저장될 때 (자동)
    • 명시적으로 프로젝션을 생성할 때 (CREATE PROJECTION)
    • 테이블을 생성할 때 프로젝션 속성을 함께 지정할 때 (e.g., Segment, Order, Ksafe )

3. 기본 Projection 유형

projection 유형 설명
Super Projection - anchor table의 모든 컬럼을 포함하고 있는 프로젝션
- 반드시 1개 이상 존재 필수
Query-Specific Projection - anchor table의 컬럼들 중 부분 집합을 포함하는 프로젝션
- 쿼리의 성능을 최적화하기 위해 생성
Aggregate Projections - SUM 및 COUNT와 같은 식 또는 집계 함수가 포함된 쿼리를 이용해서 미리 집계한 데이터를 저장하는 프로젝션
- 데이터가 적재되면서부터 집계되어 저장되므로 대량의 데이터에 대한 쿼리의 경우 효율적
Buddy Projection - 프로젝션 속성의 K-Safe로 데이터를 이중화/삼중화할 때 다른 노드에 복제되는 프로젝션
  • Vertica에서는 하나의 테이블에 Projection 2~4개 이내로 만드는 것 권장
    • Super Projection 1~2개, Query-specific Projection 2~3개 이내
  • Projection에는 실제 데이터가 저장되므로 무분별한 Projection 사용은 적재 속도에 영향을 주며, 디스크 공간을 비효율적으로 사용하게 됨

4. Projection Replication vs Segmentation (복제 vs 분산)

1) Projection Replication (프로젝션 복제)

  • Projection Replication이란 클러스터의 모든 노드들이 동일한 데이터 복사본을 가지고 있는 것
  • Dimension 테이블과 같은 작은 테이블에 쓰이며, JOIN시 유용
  • 각 노드에 데이터를 저장하므로 JOIN이 로컬에서 일어나 JOIN 성능을 높일 수 있음
  • 한 노드가 중단되더라도 다른 노드에 동일한 데이터가 존재하므로 서비스를 지속할 수 있음

2) Projection Segmentation (프로젝션 분산)

  • Projection Segmentation이란 fact 테이블과 같은 큰 테이블에 대한 데이터를 클러스터 노드 전체에 고르게 분산시키는 것
  • 이렇게 분산시키므로서 각 노드별로 데이터를 고르게 가지고 있으므로 쿼리 실행 시 workload를 여러 노드로 분산 시킬 수 있음

3) Local Join

  • 쿼리가 replication projection과 segmented projections에서 데이터 추출 시 projection 간의 JOIN은 각 노드에서 로컬로 수행되어 노드의 데이터만 반환됨
  • 각 노드에서 조회가 완료되면 결과를 집계하여 사용자에게 반환함 → 이로인해 Vertica는 쿼리를 신속하게 처리 가능
SELECT t1.twitter_id, t2.f_name, t1.tweet
FROM   TABLE1 t1
INNER JOIN TABLE2 t2
ON         t1.twitter_id = t2.twitter_id;

5. K-Safety와 Buddy Projection

  • K-Safety는 DB 클러스터의 내결함성 측정값
  • K 값= 클러스터에 존재하는 Projection Segment의 복사본 수를 의미
  • 이러한 복제본 (Buddy Projection)은 장애가 발생한 노드에 대해 다른 노드를 대신할 수 있게 하여 DB가 계속 실행되면서 데이터 무결성을 보장
  • Vertica에서 가능한 K 값 = 0, 1, 또는 2
    • K = 1: DB에서 노드가 하나 DOWN되어도 DB는 계속 정상적으로 실행됨, 잠재적으로, 클러스터에서 적어도 하나의 다른 노드가 DOWN된 노드의 데이터 복사본을 가지고 있는 한, DB는 계속 실행될 수 있음
    • K = 0: 노드 1 또는 2로 구성됨, HA 구성 불가능
    • K = 1: 노드 3개 이상 필요
    • K = 2: 노드 5개 이상 필요, HA 구성 가능

 

참조

  1. https://x2wizard.github.io/vertica_architecture/Vertica_architecture_1020/ 
  2.  
  3.