분산 예제
아래 예들은 CREATE TABLE 문에서 정의하는 옵션에 따른 데이터 분산 방식을 나타내고 있습니다.
DISTKEY 예제
TICKIT 데이터베이스의 USERS 테이블 스키마를 살펴봅니다. USERID가 SORTKEY 열과 DISTKEY 열로 정의되어 있습니다.
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'users'; column | type | encoding | distkey | sortkey ---------------+------------------------+----------+---------+--------- userid | integer | none | t | 1 username | character(8) | none | f | 0 firstname | character varying(30) | text32k | f | 0 ...
이 테이블에서 USERID를 분산 열로 사용하는 것은 좋은 선택입니다. SVV_DISKUSAGE 시스템 뷰에 대한 쿼리를 실행하면 테이블이 매우 균일하게 분산되어 있는 것을 볼 수 있습니다. 열 번호는 0부터 시작하기 때문에 USERID의 열 번호는 0입니다.
select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name='users' and col=0 and rows>0 order by slice, col; slice| col | rows | minvalue | maxvalue -----+-----+-------+----------+---------- 0 | 0 | 12496 | 4 | 49987 1 | 0 | 12498 | 1 | 49988 2 | 0 | 12497 | 2 | 49989 3 | 0 | 12499 | 3 | 49990 (4 rows)
테이블에 49,990개의 행이 포함되어 있습니다. rows(num_values) 열을 보면 각 조각마다 거의 동일한 수의 행이 포함되어 있는 것을 알 수 있습니다. minvalue 열과 maxvalue 열에는 각 조각마다 값의 범위가 표시되어 있습니다. 각 조각마다 거의 전체 범위의 값이 저장되어 있기 때문에 사용자 ID 범위를 필터링하는 쿼리에 모든 조각이 참여할 가능성이 큽니다.
이번 예에서는 작은 테스트 시스템의 분산에 대해서 설명합니다. 일반적으로 전체 조각 수는 이보다 훨씬 많습니다.
STATE 열을 사용해 공통적으로 조인 또는 분류하는 경우에는 STATE 열을 기준으로 분산시킬 수 있습니다. 다음은 USERS 테이블과 동일한 데이터로 새로운 테이블을 생성하지만 DISTKEY를 STATE 열로 설정할 경우를 보여주는 예입니다. 이 경우 배포는 균등하지 않습니다. 조각 0(13,587 행)에는 조각 3(10,150 행)보다 약 30% 많은 행이 저장되어 있습니다. 이보다 훨씬 큰 테이블에서 이러한 크기의 분산 스큐가 발생하면 쿼리 처리에 부정적인 영향을 미칠 수 있습니다.
create table userskey distkey(state) as select * from users; select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'userskey' and col=0 and rows>0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 13587 | 5 | 49989 1 | 0 | 11245 | 2 | 49990 2 | 0 | 15008 | 1 | 49976 3 | 0 | 10150 | 4 | 49986 (4 rows)
DISTSTYLE EVEN 예제
USERS 테이블과 동일한 데이터로 새로운 테이블을 생성하더라도 DISTSTYLE을 EVEN으로 설정하면 행이 항상 균일하게 조각으로 분산됩니다.
create table userseven diststyle even as select * from users; select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'userseven' and col=0 and rows>0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 12497 | 4 | 49990 1 | 0 | 12498 | 8 | 49984 2 | 0 | 12498 | 2 | 49988 3 | 0 | 12497 | 1 | 49989 (4 rows)
하지만 분산이 특정 열을 기준으로 이루어지지 않기 때문에 특히 테이블이 다른 테이블에 조인되는 경우에는 쿼리 처리 성능이 떨어질 수 있습니다. 조인 열에 따른 분산 부재는 종종 효율적으로 실행될 수 있는 유형의 조인 작업에 영향을 미치기도 합니다. 두 테이블이 각각 조인 열을 기준으로 분산 및 정렬되면 조인, 집계, 분류 등의 작업이 최적화됩니다.
DISTSTYLE ALL 예제
USERS 테이블과 동일한 데이터로 새로운 테이블을 생성하더라도 DISTSTYLE을 ALL로 설정하면 모든 행이 각 노드의 첫 번째 조각으로 분산됩니다.
select slice, col, num_values as rows, minvalue, maxvalue from svv_diskusage where name = 'usersall' and col=0 and rows > 0 order by slice, col; slice | col | rows | minvalue | maxvalue ------+-----+-------+----------+---------- 0 | 0 | 49990 | 4 | 49990 2 | 0 | 49990 | 2 | 49990 (4 rows)