Aurora PostgreSQL Limitless Database 的 DML 限制和其他信息 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Aurora PostgreSQL Limitless Database 的 DML 限制和其他信息

以下主题描述了 Aurora PostgreSQL Limitless Database 中的 DML 和查询处理 SQL 命令的限制或提供了更多信息。

ANALYZE

ANALYZE 命令收集有关数据库中表内容的统计数据。随后,查询计划器使用这些统计数据来帮助确定最有效的查询执行计划。有关更多信息,请参阅 PostgreSQL 文档中的 ANALYZE

在 Aurora PostgreSQL Limitless Database 中,ANALYZE 命令在运行时收集所有路由器和分片的表统计数据。

为避免在 ANALYZE 运行期间在每台路由器上计算统计数据,表统计数据在其中一台路由器上计算,然后再将其复制到对等路由器。

CLUSTER

CLUSTER 命令根据索引对表进行物理重新排序。索引必须已经在表上定义。在 Aurora PostgreSQL Limitless Database 中,集群是每个分片上存在的索引部分的本地集群。

有关更多信息,请参阅 PostgreSQL 文档中的 CLUSTER

EXPLAIN

您可以使用以下参数来配置 EXPLAIN 命令的输出:

  • rds_aurora.limitless_explain_optionsEXPLAIN 输出中要包含的内容。默认值为 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_planssingle_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

INSERT

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

UPDATE

不支持更新分片密钥。例如,您有一个名为 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

VACUUM

您可以对分片表和引用表执行清理。Aurora PostgreSQL Limitless Database 完全支持以下 VACUUM 函数:

  • VACUUM

  • ANALYZE

  • DISABLE_PAGE_SKIPPING

  • FREEZE

  • FULL

  • INDEX_CLEANUP

  • PARALLEL

  • PROCESS_TOAST

  • TRUNCATE

  • VERBOSE

Aurora PostgreSQL Limitless Database 上的 VACUUM 具有以下限制:

有关 VACUUM 命令的更多信息,请参阅 PostgreSQL 文档中的 VACUUM。有关 Aurora PostgreSQL Limitless Database 中清理工作原理的更多信息,请参阅通过清理回收存储空间