

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Redshift 테이블 설계 모범 사례
<a name="best-practices-tables"></a>

이 섹션에서는 데이터베이스 테이블 설계에 대한 모범 사례 개요를 제공합니다. 최적의 쿼리 성능과 효율성을 달성하려면 다음 모범 사례를 따르는 것이 좋습니다.

## 정렬 키 작동 방식 이해
<a name="sort-keys"></a>

Amazon Redshift는 정렬 키에 따라 정렬된 순서로 디스크에 데이터를 저장합니다. Amazon Redshift 쿼리 옵티마이저는 최적의 쿼리 계획을 결정할 때 정렬 순서를 사용합니다. 정렬 키를 효과적으로 사용하려면 다음을 수행하는 것이 좋습니다.
+ 테이블을 최대한 정렬된 상태로 유지합니다.
+ `VACUUM` 정렬을 사용하여 최적의 성능을 복원합니다.
+ 정렬 키 열은 압축하지 마세요.
+ 정렬 키가 압축되고 `sortkey1_skew` 비율이 상당히 높으면 정렬 키에서 압축을 활성화하지 않고 테이블을 다시 생성합니다.
+ 정렬 키 열에 함수를 적용하지 마세요. 예를 들어 다음 쿼리에서는 `DATE`로 캐스팅하는 경우 `trans_dt : TIMESTAMPTZ` 정렬 키 열이 사용되지 않습니다.

  ```
  select order_id, order_amt
  from sales
  where trans_dt::date = '2021-01-08'::date
  ```
+ 정렬 키 순서로 `INSERT` 작업을 수행합니다.
+ 가능하면 `GROUP BY` 절에서 정렬 키를 사용합니다.

### 쿼리 조정 팁
<a name="tuning-tips"></a>

쿼리를 조정하려면 다음을 수행하는 것이 좋습니다.
+ 최적의 효과를 위해 항상 복합 정렬 키를 최저 카디널리티에서 최고 카디널리티로 정렬합니다.
+ 복합 정렬 키의 선행 키가 상대적으로 고유한 경우(즉, 카디널리티가 높은 경우) 정렬 키에 열을 더 추가하지 마세요. 열을 더 추가하면 쿼리 성능에는 거의 영향을 미치지 않지만 유지 관리 비용이 추가됩니다.

## 정렬 키 효과 평가
<a name="sort-key-effectiveness"></a>

쿼리를 최적화하려면 쿼리의 효과를 평가할 수 있어야 합니다. [SVL\_QUERY\_SUMMARY](https://docs.aws.amazon.com/redshift/latest/dg/r_SVL_QUERY_SUMMARY.html) 보기를 사용하여 쿼리 실행에 대한 일반 정보를 찾는 것이 좋습니다. 이 보기에서 `IS_RRSCAN` 속성을 사용하여 `EXPLAIN` 계획 단계에서 범위 제한 스캔을 사용하는지 확인할 수 있습니다. `rows_pre_filter` 속성을 사용하여 정렬 키의 선택성을 결정할 수도 있습니다.

[v\_my\_last\_query\_summary](https://github.com/awslabs/amazon-redshift-utils/blob/master/src/AdminViews/v_my_last_query_summary.sql)라는 GitHub의 관리 보기를 사용할 수도 있습니다. 보기에는 실행된 마지막 쿼리에 대한 정보가 표시됩니다.

다음 명령문은 쿼리 실행에 대한 일반적인 정보를 찾는 방법을 보여줍니다.

```
select lpad(' ',stm+seg+step) || label as label, 
       rows, 
       bytes, 
       is_diskbased, 
       is_rrscan, 
       rows_pre_filter 
from svl_query_summary 
where query = pg_last_query_id() 
order by stm, seg, step;
```

이전 쿼리에서는 다음과 같은 출력 샘플을 반환합니다.



![이전 쿼리의 출력 샘플.](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/query-best-practices-redshift/images/query-output.png)


## 테이블 이해
<a name="know-table"></a>

테이블의 중요한 속성을 이해하는 것이 중요합니다. 테이블에 대해 자세히 알아보려면 다음을 수행합니다.
+ [PG\_TABLE\_DEF](https://docs.aws.amazon.com/redshift/latest/dg/r_PG_TABLE_DEF.html)를 사용하여 테이블 열에 대한 정보를 봅니다.
+ [SVV\_TABLE\_INFO](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_TABLE_INFO.html)를 사용하여 데이터 분배 스큐, 키 분배 스큐, 테이블 크기, 통계 등 테이블에 대해 더욱 포괄적인 정보를 봅니다.

## 올바른 테이블 분배 스타일 선택
<a name="distribution-style"></a>

쿼리를 실행하면 쿼리 옵티마이저가 필요에 따라 쿼리 행을 컴퓨팅 노드로 다시 분산시켜 조인 및 집계를 실행합니다. 테이블 배포 스타일을 선택하는 목적은 쿼리 실행 이전에 데이터의 배포 위치를 지정하여 재배포 단계의 영향을 최소화하는 데 있습니다. 

올바른 테이블 분배 스타일을 선택하려면 다음과 같은 접근 방식을 사용하는 것이 좋습니다.
+ 동일한 노드 내에 행을 공동 배치하여 쿼리 실행 계획에서 브로드캐스팅 및 재분배를 방지합니다. 예를 들어 `DISTKEY`를 선택하면 팩트 테이블과 1차원 테이블을 공통 열에 분배할 수 있습니다. 필터링된 데이터 집합의 크기를 기준으로 가장 큰 차원을 선택합니다. 조인에 사용되는 행만 분산시켜야 하기 때문에 테이블 크기가 아닌 필터링 이후 데이터 세트의 크기를 고려합니다.
+ 분배 키가 생성되는 열에 스큐가 없는지 확인합니다. 그렇지 않으면 한 컴퓨팅 노드가 다른 컴퓨팅 노드보다 더 많은 작업을 수행할 수 있습니다. 스큐 현상을 발견하면 분산 키 열 변경을 고려합니다. 열의 값이 균일하게 분배되거나 해당 카디널 값이 더 높은 경우 열을 분배 키의 후보로 간주할 수 있습니다.
+ 조인 조건에 사용되는 테이블이 작으면(1GB 미만) `ALL` 분배 스타일을 고려합니다.
+ 분배 키는 압축할 수 있지만 정렬 키 열(특히 정렬 키의 첫 번째 열)을 압축하지 않아야 합니다.

**참고**  
자동 테이블 최적화를 사용하는 경우 테이블의 분배 스타일을 선택할 필요가 없습니다. 자세한 내용은 Amazon Redshift 설명서의 [자동 테이블 최적화 작업](https://docs.aws.amazon.com/redshift/latest/dg/t_Creating_tables.html)을 참조하세요. Amazon Redshift에서 적절한 배포 스타일을 선택하도록 하려면 배포 스타일에 `AUTO`를 지정합니다.