본문 바로가기
프로N잡러/프로그래밍&자격증

[GPDB] 4-2.Data Definition Language(DDL) : Distribution

by 뮤지구 2024. 1. 9.

Distribution


  • GPDB 모든 테이블은 Distribution key 에 의해 분산되어 sdw 에 저장됨.
  • 1개~여러개 컬럼이 Distribution key 로서 사용됨.
  • high cardinality 를 가져야 함.
  • 분포(skew 가 없도록)와, local join 을 고려하여 설계 필요.
  • PK 나 UK 가 있다면, 분산키는 반드시 그 중에 하나의 컬럼이라도 포함해야 함. (중요!)
  • 분산 방식

① Distributed by (column)
- hash distribution
- 명시되지 않았을 경우, 해당 테이블의 PK(PK 존재할 경우)나 1번째 컬럼(PK 존재하지 않을 경우)으로 사용됨
- 자주 join되는 테이블은 select 하였을 때 같은 segment 내에서 처리(local join)될 수 있도록 동일 분산키 지정 필요 (Best Case!)
- 최대한 Broadcast / Redistribution motion 이 덜 일어나도록 설계 필요

② Distributed by randomly
- random distribution (round-robin 방식 등)
- 마땅한 분산키가 없을 경우 사용할 수 있음. (minimal data skew)
- 쏠리지 않게 저장은 가능하나, select 시 어디에 무엇이 있는지 정보가 없어 오래 걸릴 수 있음.

③ Distributed by replicated (GPv6 부터 지원)
- 전체 복제를 하여 저장하는 방식.
- Disk 를 다른 방식보다 많이 사용하므로, 필요에 따라 성능상 이점이 있을 경우 사용(검증 필요)

--distributed by column
CREATE TABLE tab_test (a int , b text, c timestamp) DISTRIBUTED BY (a);
CREATE TABLE tab_test (a int , b text, c timestamp) DISTRIBUTED BY (a,b);

--distibuted by Random (which allows a good distribution if no combination of fields gives an optimal distribution)
CREATE TABLE tab_test (a int , b text, c timestamp) DISTRIBUTED RANDOMLY;

-- pk 가 지정되어 있을 경우 분산키 pk 로 설정
CREATE TABLE tab_test (a int , b text, c timestamp, CONSTRAINT pk_tab_test PRIMARY KEY (a));

 

+ 분산 방식 변경을 위해선?

drop 이나 recreate 필요 없이 alter 명령어로 분산 방식 변경 가능

 
--Change of the Distribution Key (No need to drop and recreate the table)
ALTER TABLE tab_test set distributed by (c);
ALTER TABLE tab_test set distributed randomly;

--Redistribution on the same key (Useful for reorg)
ALTER TABLE tab_test set with (REORGANIZE=true);

--Check of the quality of the distribution (잘 분산되었는지 각 segment 건수 확인, skewness 확인)
Select gp_segment_id as num_segment,count (1) as nb_lig
from tab_test
Group by gp_segment_id
order by gp_segment_id

  • skew
    - 특정 segment 로 데이터가 몰리는 현상
    - 종류
    ① Data Skew : 실제 저장되는 데이터가 특정 segment 에 몰리는 경우
    ② Processing skew : 실제 데이터는 잘 저장되어 있지만, 쿼리가 돌면서 발생하는 skew
                                         쿼리 조건에 의해 특정 segment 에 있는 data만 사용하게 되는 경우

  • Example

  • 주의할 점
    - 가상의 컬럼 생성해서 지정하지 말자 (절대 local join 이 될 수 없는 환경)
    - boolean 등 cardinality 가 낮은 컬럼으로 분산키 설정하지 말자
    - floating point data type 지정하지 말자
    - distribute randomly 가 쉽다는 이유만으로 그냥 분산키 설정하지 말자
    - processing skew 를 피할 수 있도록 분산키 설정하도록 하자


 

Quiz


3, x