

# 표준 테이블을 무한 테이블로 변환
<a name="limitless-converting-standard"></a>

표준 테이블을 샤딩된 테이블 또는 참조 테이블로 변환할 수 있습니다. 변환 중에 데이터가 표준 테이블에서 분산 테이블로 이동한 다음 소스 표준 테이블이 삭제됩니다. `INSERT INTO SELECT FROM` 명령으로 데이터가 이동합니다.

**Contents**
+ [샤딩된 테이블 만들기](#limitless-creating-sharded)
+ [공동 배치된 테이블 만들기](#limitless-creating-sharded.colocated)
+ [참조 테이블 만들기](#limitless-creating-reference)

## 샤딩된 테이블 만들기
<a name="limitless-creating-sharded"></a>

표준 테이블에서 `rds_aurora.limitless_alter_table_type_sharded` 프로시저를 실행하여 샤딩된 테이블을 만듭니다. 이 프로시저에서는 표준 테이블과 열 목록을 가져온 다음 열 목록을 샤드 키로 사용하여 지정된 테이블을 배포합니다. 프로시저는 동기식으로 실행되고 테이블에서 `ACCESS EXCLUSIVE` 잠금을 획득합니다.

프로시저가 성공적으로 완료되면 소스 표준 테이블이 삭제되고 이름이 같은 샤딩된 테이블을 사용할 수 있게 됩니다.

`rds_aurora.limitless_alter_table_type_sharded` 프로시저는 다음과 같은 구문을 사용합니다.

```
postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('{{schema}}.{{table}}', ARRAY['{{shard_key1}}', '{{shard_key2}}', ... '{{shard_keyn}}']);
```

프로시저에는 다음과 같은 파라미터가 필요합니다.
+ `schema` - 샤딩할 테이블이 포함된 데이터베이스 스키마입니다. 스키마가 지정되지 않은 경우 프로시저는 `search_path`를 사용합니다.
+ `table` - 샤딩할 테이블입니다.
+ `shard_keyn` - 샤드 키로 사용할 테이블 열의 배열입니다.

  샤드 키 값은 문자열 리터럴이므로 대/소문자를 구분합니다. 샤드 키에 작은따옴표(')가 포함된 경우 다른 작은따옴표를 사용하여 이스케이프 처리합니다. 예를 들어 테이블 열의 이름이 `customer's id`인 경우 `customer''s id`를 샤드 키로 사용합니다. 백슬래시(\\)와 큰따옴표(")는 이스케이프 처리할 필요가 없습니다.

**참고**  
모든 프라이머리 키 및 고유 키에는 샤드 키가 포함되어야 합니다. 즉, 샤드 키는 프라이머리 키 또는 고유 키의 하위 집합입니다.  
샤딩된 테이블에서 `CHECK` 제약은 표현식을 지원하지 않습니다.  
자세한 내용은 [제약 조건](limitless-reference.DDL-limitations.md#limitless-reference.DDL-limitations.Constraints) 단원을 참조하십시오.

**샤딩된 테이블을 만드는 방법**

다음 예시에서는 `customer_id` 샤드 키를 사용하여 `customer` 샤딩된 테이블을 만드는 방법을 보여줍니다.

1. 표준 테이블을 만듭니다.

   ```
   CREATE TABLE customer (customer_id INT PRIMARY KEY NOT NULL, zipcode INT, email VARCHAR);
   ```

1. 표준 테이블을 샤딩된 테이블로 변환합니다.

   ```
   postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('public.customer', ARRAY['customer_id']);
   
   postgres=> \d
   
                       List of relations
    Schema |     Name     |       Type        |       Owner
   --------+--------------+-------------------+--------------------
    public | customer     | partitioned table | postgres_limitless
    public | customer_fs1 | foreign table     | postgres_limitless
    public | customer_fs2 | foreign table     | postgres_limitless
    public | customer_fs3 | foreign table     | postgres_limitless
    public | customer_fs4 | foreign table     | postgres_limitless
    public | customer_fs5 | foreign table     | postgres_limitless
   (6 rows)
   ```

## 공동 배치된 테이블 만들기
<a name="limitless-creating-sharded.colocated"></a>

두 개 이상의 테이블이 동일한 샤드 키를 사용하여 샤딩되는 경우 해당 테이블을 명시적으로 정렬(공동 배치)할 수 있습니다. 두 개 이상의 테이블이 공동 배치되면 동일한 샤드 키 값을 가진 테이블의 행이 동일한 샤드에 배치됩니다. 공동 배치는 일부 작업을 단일 샤드로 제한하여 성능을 개선하는 데 도움이 됩니다.

다음 구문과 함께 `rds_aurora.limitless_alter_table_type_sharded` 프로시저를 사용합니다.

```
postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('{{schema}}.{{collocated_table}}', ARRAY['{{shard_key1}}', '{{shard_key2}}', ... '{{shard_keyn}}'], '{{schema}}.{{sharded_table}}');
```

프로시저에는 다음과 같은 파라미터가 필요합니다.
+ `schema` - 공동 배치할 테이블이 포함된 데이터베이스 스키마입니다. 스키마가 지정되지 않은 경우 프로시저는 `search_path`를 사용합니다.
+ `collocated_table` - 공동 배치할 테이블입니다.
+ `shard_keyn` - 샤드 키로 사용할 테이블 열의 배열입니다.

  동일한 열 이름 및 열 유형을 포함하여 원래 샤딩된 테이블과 동일한 샤드 키를 사용해야 합니다.
+ `sharded_table` - `collocated_table`을 공동 배치할 때 사용하는 샤딩된 테이블입니다.

**공동 배치된 테이블을 만드는 방법**

1. [샤딩된 테이블 만들기](#limitless-creating-sharded)의 프로시저에 따라 첫 번째 샤딩된 테이블을 만듭니다.

1. 공동 배치된 테이블의 표준 테이블을 만듭니다.

   ```
   CREATE TABLE mytable2 (customer_id INT PRIMARY KEY NOT NULL, column1 INT, column2 VARCHAR);
   ```

1. 표준 테이블을 공동 배치된 테이블로 변환합니다.

   ```
   postgres=> CALL rds_aurora.limitless_alter_table_type_sharded('public.mytable2', 
   ARRAY['customer_id'], 'public.customer');
   
   postgres=> \d
   
                       List of relations
    Schema |     Name     |       Type        |       Owner
   --------+--------------+-------------------+--------------------
    public | customer     | partitioned table | postgres_limitless
    public | customer_fs1 | foreign table     | postgres_limitless
    public | customer_fs2 | foreign table     | postgres_limitless
    public | customer_fs3 | foreign table     | postgres_limitless
    public | customer_fs4 | foreign table     | postgres_limitless
    public | customer_fs5 | foreign table     | postgres_limitless
    public | mytable2     | partitioned table | postgres_limitless
    public | mytable2_fs1 | foreign table     | postgres_limitless
    public | mytable2_fs2 | foreign table     | postgres_limitless
    public | mytable2_fs3 | foreign table     | postgres_limitless
    public | mytable2_fs4 | foreign table     | postgres_limitless
    public | mytable2_fs5 | foreign table     | postgres_limitless
   (12 rows)
   ```

## 참조 테이블 만들기
<a name="limitless-creating-reference"></a>

표준 테이블에서 `rds_aurora.limitless_alter_table_type_reference` 프로시저를 실행하여 참조 테이블을 만듭니다. 이 프로시저는 지정된 테이블을 DB 샤드 그룹의 모든 샤드에 복제하고 테이블 유형을 참조로 변경합니다. 프로시저는 동기식으로 실행되고 테이블에서 `ACCESS EXCLUSIVE` 잠금을 획득합니다.

프로시저가 성공적으로 완료되면 소스 표준 테이블이 삭제되고 이름이 같은 참조 테이블을 사용할 수 있게 됩니다.

`rds_aurora.limitless_alter_table_type_reference` 프로시저는 다음과 같은 구문을 사용합니다.

```
postgres=> CALL rds_aurora.limitless_alter_table_type_reference('{{schema}}.{{table}}');
```

저장 프로시저에는 다음 파라미터가 필요합니다.
+ `schema` - 복제할 테이블이 포함된 데이터베이스 스키마입니다. 스키마가 지정되지 않은 경우 프로시저는 `search_path`를 사용합니다.
+ `table` - 복제할 테이블입니다.

**참고**  
참조 테이블을 만들 때 사용하는 표준 테이블에는 프라이머리 키가 있어야 합니다.  
참조 테이블에서 `CHECK` 제약은 표현식을 지원하지 않습니다.  
이전 함수인 `limitless_table_alter_type_reference`는 더 이상 사용되지 않습니다.

**참조 테이블을 만드는 방법**

다음 예시에서는 `zipcodes` 참조 테이블을 만드는 방법을 보여줍니다.

1. 표준 테이블을 만듭니다.

   ```
   CREATE TABLE zipcodes (zipcode INT PRIMARY KEY, details VARCHAR);
   ```

1. 표준 테이블을 참조 테이블로 변환합니다.

   ```
   CALL rds_aurora.limitless_alter_table_type_reference('public.zipcodes');
   
   postgres=> \d
   
                       List of relations
    Schema |     Name     |       Type        |       Owner
   --------+--------------+-------------------+--------------------
    public | customer     | partitioned table | postgres_limitless
    public | customer_fs1 | foreign table     | postgres_limitless
    public | customer_fs2 | foreign table     | postgres_limitless
    public | customer_fs3 | foreign table     | postgres_limitless
    public | customer_fs4 | foreign table     | postgres_limitless
    public | customer_fs5 | foreign table     | postgres_limitless
    public | zipcodes     | foreign table     | postgres_limitless
   (7 rows)
   ```

   출력에는 `customer` 샤딩된 테이블과 `zipcodes` 참조 테이블이 표시됩니다.