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
'프로N잡러 > 프로그래밍&자격증' 카테고리의 다른 글
[GPDB] 4-4. Data Definition Language(DDL) : Indexes, View, Sequence (0) | 2024.01.09 |
---|---|
[GPDB] 4-3. Data Definition Language(DDL) : Data Types (0) | 2024.01.09 |
[GPDB] 4-1. Data Definition Language(DDL) : Table (0) | 2024.01.09 |
[GPDB] 3. Role & Access (인증, 권한 관리) (1) | 2024.01.09 |
[GPDB] 2. DB Instance (DB, Schema) (0) | 2024.01.09 |