

# 標準テーブルから無制限テーブルへの変換
<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` を使用してシャードテーブル `customer_id` を作成する方法を示しています。　

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>

同じシャードキーを使用して 2 つ以上のテーブルがシャードされている場合は、それらのテーブルを明示的に整列 (コロケーション) できます。2 つ以上のテーブルがコロケーションされると、同じシャードキー値を持つテーブルの行が同じシャードに配置されます。コロケーションは、一部のオペレーションを単一のシャードに制限するのに役立ちます。これにより、パフォーマンスが向上します。

次の構文で `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` が表示されます。