

# 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` 运行期间在每台路由器上计算统计数据，表统计数据在其中一台路由器上计算，然后再将其复制到对等路由器。

## 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)
```

现在，我们将 `rds_aurora.limitless_explain_options` 设置为包含 `shard_plans` 和 `single_shard_optimization`。我们可以在路由器和分片上查看语句的执行计划。此外，我们可以禁用 `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>

Aurora PostgreSQL Limitless Database 支持大多数 `INSERT` 命令。

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>

不支持更新分片密钥。例如，您有一个名为 `customers` 的分片表，其分片键为 `customer_id`。以下 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)。