Amazon Redshift 분산방식(diststyle) - AUTO, ALL, EVEN, KEY
지난 번 Amazon Redshift 알아보기 글에서 '테이블을 생성할 때, 컬럼 1개를 분산 키(distribution key)로 지정할 수 있는데, 정의된 분산 키에 따라 행이 노드 슬라이스로 분산됩니다.' 라는 언급을 한 적이 있는데요. Amazon Redshift 에서 테이블을 생성할 때, 분산 방식(distribution style)을 지정할 수 있습니다. 이 때, 총 4가지 옵션 AUTO, EVEN, KEY, ALL 중 하나를 선택할 수 있습니다.
분산방식(DISTSTYLE) 지정 방법
테이블 생성 시, 아래 스크립트와 같이 CREATE TABLE 구문과 함께 끝에 DISTSTYLE [분상방식 옵션]을 지정해주면 됩니다. DISTSTYLE을 KEY로 했을 경우에만 추가적으로 어떤 컬럼을 기준으로 데이터를 분산시킬 것인지 DISTKEY를 추가로 명시해주시면 됩니다!
CREATE TABLE [테이블명] ([컬럼명] INT)
DISTSTYLE KEY DISTKEY([컬럼명]);
CREATE TABLE [테이블명] ([컬럼명] INT)
DISTSTYLE EVEN;
CREATE TABLE [테이블명] ([컬럼명] INT)
DISTSTYLE ALL;
CREATE TABLE [테이블명] ([컬럼명] INT)
DISTSTYLE AUTO;
*만약 diststyle을 명시하지 않을 경우, Amazon Redshift에서는 자동으로 AUTO 방식을 채택합니다.
(참고)테이블 분산방식 확인용 시스템 조회 쿼리
각 테이블들이 분산 방식이 어떻게 되어있고, 분산 키가 뭘로 지정되어있는지 확인하고 싶을 때, 사용할 수 있는 시스템 조회 쿼리입니다. 가끔씩 확인을 위해 찾아볼 때가 있어 유용하게 잘 사용했어서 함께 첨부해봅니다. 조건 추가 및 수정해서 더 좁은 범위 조회도 가능합니다.(당연하지만) *회사 보안 규칙 상, 권한 문제로 시스템 쿼리는 조회가 불가한 경우도 있을 수 있으니 이 부분은 확인해보시는 걸 추천드립니다.
SELECT "schema", "table", diststyle FROM SVV_TABLE_INFO
WHERE "table" LIKE 'dist%';
분산방식(DISTSTYLE)
- ALL(전체분산)
전체 테이블 데이터를 모든 노드에 복사하는 방식입니다. ALL 방식의 경우 데이터 업데이트가 빈번하지 않은 경우 적절하다고 공식문서에서도 언급하고 있습니다. 테이블의 데이터가 크지않고 변경이 잦지않으며 공통적으로 JOIN해서 사용하는 테이블에 적절히 적용하면 좋습니다. 예시로 달력 혹은 코드 정의 테이블 등이 될 수 있습니다. - KEY(키분산)
지정된 컬럼을 기준으로 테이블 데이터를 분산처리하는 방식입니다. 해시 값을 통해 각 컴퓨팅 노드의 슬라이스가 선택되며 분산키가 같은 값을 가지는 경우 같은 슬라이스에 저장됩니다. 이 때, 분산키의 지정은 데이터 skew가 크지않고(고른 분포형태) JOIN에서 자주 사용되는 컬럼이 좋습니다. - EVEN(균등분산)
리더 노드가 라운드-로빈 방식으로 어떤 특장한 컬럼 값에 상관없이 슬라이스에 걸쳐서 데이터를 분산하는 방식입니다. 이는 명확하게 KEY 방식과 ALL 방식 중 선택할 수 없을 때(명확히 지정할 분산키가 없거나 전체 분산을 하기엔 데이터가 대용량인 경우), 혹은 JOIN 작업이 없는 테이블에 대해 적절합니다. - AUTO
명칭에서 추측이 가능한 방식인데요. Amazon Redshift에서 최적이라고 판단되는 distribution style을 할당하는 방식입니다. 기본적으로는 테이블의 데이터 크기를 기반으로 하고 있고요. 공식문서에도 언급된 예시로, 작은 사이즈의 테이블에 처음에는 ALL 방식을, 점점 데이터가 커져가면 DISTSTYLE로 변경합니다. DISTKEY의 경우는 주로 Primary Key로 지정된 컬럼(복합인 경우도 있음)을 사용합니다. 만약 테이블의 데이터가 커졌지만 적합한 분산키(DISTKEY)가 없을 시에는 EVEN 방식으로 변경합니다.
코멘트
가지는 데이터의 양과 분포 그리고 테이블의 (사용)목적 등을 모두 고려해야한다는 점에서 처음에 분산방식(나아가 분산키까지)을 결정하는게 참 어려웠던 것 같습니다. 가장 많이 찾아보고 고민해본 부분이었던 것 만큼 한번쯤을 글로 나눠서 작성해보고 싶었어요. 여전히 글로 쓰는건 어렵지만요🤣 경험이 쌓이면 추가로 예시 내용을 이 글에 좀 더 보강해보고 싶네요