

# Aurora PostgreSQL Limitless Database の DML 制限とその他の情報
<a name="limitless-reference.DML-limitations"></a>

以下のトピックでは、Aurora PostgreSQL Limitless Database での DML コマンドとクエリ処理 SQL コマンドの制限や詳細について説明します。

**Topics**
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ [CLUSTER](#limitless-reference.DML-limitations.CLUSTER)
+ [EXPLAIN](#limitless-reference.DML-limitations.EXPLAIN)
+ [INSERT](#limitless-reference.DML-limitations.INSERT)
+ [UPDATE](#limitless-reference.DML-limitations.UPDATE)
+ [VACUUM](#limitless-reference.DML-limitations.VACUUM)

## ANALYZE
<a name="limitless-reference.DML-limitations.ANALYZE"></a>

`ANALYZE` コマンドは、データベース内のテーブルの内容に関する統計を収集します。その後、クエリプランナーはこれらの統計を使用して、最も効率的なクエリの実行プランを決定します。詳細については、「PostgreSQL ドキュメント」の「[ANALYZE](https://www.postgresql.org/docs/current/sql-analyze.html)」を参照してください。

Aurora PostgreSQL Limitless Database では、`ANALYZE` コマンドは実行時にすべてのルーターとシャードのテーブル統計を収集します。

`ANALYZE` の実行中にすべてのルーターで統計情報が計算されないように、テーブル統計は 1 つのルーターで計算され、その後ピアルーターにコピーされます。

## CLUSTER
<a name="limitless-reference.DML-limitations.CLUSTER"></a>

`CLUSTER` コマンドは、インデックスに基づいてテーブルの順序を物理的に変更します。インデックスはテーブルで既に定義されている必要があります。Aurora PostgreSQL Limitless Database では、クラスタリングは各シャードに存在するインデックスの一部に対してローカルです。

詳細については、PostgreSQL ドキュメントの「[CLUSTER](https://www.postgresql.org/docs/current/sql-cluster.html)」を参照してください。

## EXPLAIN
<a name="limitless-reference.DML-limitations.EXPLAIN"></a>

次のパラメータを使用して、`EXPLAIN` コマンドからの出力を設定します。
+ `rds_aurora.limitless_explain_options` – `EXPLAIN` 出力に含める内容。デフォルト値は `single_shard_optimization` です。プランが単一シャード最適化かどうかが表示されますが、シャードプランは含まれません。

この例では、`EXPLAIN` 出力にはシャードからのプランは表示されません。

```
postgres_limitless=> EXPLAIN SELECT * FROM employees where id =25;

                      QUERY PLAN
------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
 Single Shard Optimized
(2 rows)
```

ここで、`shard_plans` と `single_shard_optimization` を含めるように `rds_aurora.limitless_explain_options` を設定します。ルーターとシャードの両方で、ステートメントの実行プランを確認できます。さらに、`enable_seqscan` パラメータを無効にして、シャードレイヤーでインデックススキャンが使用されるようにします。

```
postgres_limitless=> SET rds_aurora.limitless_explain_options = shard_plans, single_shard_optimization;
SET

postgres_limitless=> SET enable_seqscan = OFF;
SET

postgres_limitless=> EXPLAIN SELECT * FROM employees WHERE id = 25;

                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Foreign Scan  (cost=100.00..101.00 rows=100 width=0)
   Remote Plans from Shard postgres_s4:
         Index Scan using employees_ts00287_id_idx on employees_ts00287 employees_fs00003  (cost=0.14..8.16 rows=1 width=15)
           Index Cond: (id = 25)
 Single Shard Optimized
(5 rows)
```

`EXPLAIN` コマンドの詳細については、PostgreSQL ドキュメントの「[EXPLAIN](https://www.postgresql.org/docs/current/sql-explain.html)」を参照してください。

## INSERT
<a name="limitless-reference.DML-limitations.INSERT"></a>

ほとんどの `INSERT` コマンドは、Aurora PostgreSQL Limitless Database でサポートされています。

PostgreSQL には明示的な `UPSERT` コマンドはありませんが、`INSERT ... ON CONFLICT` ステートメントをサポートしています。

競合アクションにサブクエリまたは可変関数が含まれている場合、`INSERT ... ON CONFLICT` はサポートされません。

```
-- RANDOM is a mutable function.
INSERT INTO sharded_table VALUES (1, 100) ON CONFLICT (id) DO UPDATE SET other_id = RANDOM();

ERROR: Aurora Limitless Tables doesn't support pushdown-unsafe functions with DO UPDATE clauses.
```

`INSERT` コマンドの詳細については、PostgreSQL ドキュメントの「[INSERT](https://www.postgresql.org/docs/current/sql-insert.html)」を参照してください。

## UPDATE
<a name="limitless-reference.DML-limitations.UPDATE"></a>

シャードキーの更新はサポートされていません。例えば、シャードキー `customer_id` を持つ `customers` というシャードテーブルがあるとします。次の DML ステートメントはエラーを引き起こします。

```
postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_id =1;
ERROR:  Shard key column update is not supported

postgres_limitless=> UPDATE customers SET customer_id = 11 WHERE customer_name='abc';
ERROR:  Shard key column update is not supported
```

シャードキーを更新するには、まずシャードキーを持つ行を `DELETE` し、次に更新されたシャードキー値を持つ新しい行を `INSERT` する必要があります。

`UPDATE` コマンドの詳細については、PostgreSQL ドキュメントの「[Updating data](https://www.postgresql.org/docs/current/dml-update.html)」を参照してください。

## VACUUM
<a name="limitless-reference.DML-limitations.VACUUM"></a>

シャードテーブルとリファレンステーブルの両方でバキュームを実行できます。Aurora PostgreSQL Limitless Database では、次の `VACUUM` 関数が完全にサポートされています。
+ VACUUM
+ [ANALYZE](#limitless-reference.DML-limitations.ANALYZE)
+ DISABLE\$1PAGE\$1SKIPPING
+ FREEZE
+ FULL
+ INDEX\$1CLEANUP
+ PARALLEL
+ PROCESS\$1TOAST
+ TRUNCATE
+ VERBOSE

Aurora PostgreSQL Limitless Database の `VACUUM` には、次の制限があります。
+ [pg\$1visibility\$1map](https://www.postgresql.org/docs/current/pgvisibility.html) 拡張機能はサポートされていません。
+ [pg\$1stat\$1all\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ALL-INDEXES-VIEW) ビューで未使用のインデックスをチェックすることはサポートされていません。
+ [pg\$1stat\$1user\$1indexes](https://www.postgresql.org/docs/current/monitoring-stats.html)、[pg\$1class](https://www.postgresql.org/docs/current/catalog-pg-class.html)、[pg\$1stats](https://www.postgresql.org/docs/current/view-pg-stats.html) の統合ビューは実装されていません。

`VACUUM` コマンドの詳細については、PostgreSQL ドキュメントの「[VACUUM](https://www.postgresql.org/docs/current/sql-vacuum.html)」を参照してください。Aurora PostgreSQL Limitless Database でのバキューム処理の仕組みの詳細については、「[バキューム処理によるストレージ容量の再利用](limitless-vacuum.md)」を参照してください。