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_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
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
-
DISABLE_PAGE_SKIPPING
-
FREEZE
-
FULL
-
INDEX_CLEANUP
-
PARALLEL
-
PROCESS_TOAST
-
TRUNCATE
-
VERBOSE
Aurora PostgreSQL Limitless Database 上的 VACUUM
具有以下限制:
-
不支持 pg_visibility_map
扩展。 -
不支持使用 pg_stat_all_indexes
视图检查未使用的索引。 -
未实施 pg_stat_user_indexes
、pg_class 和 pg_stats 的合并视图。
有关 VACUUM
命令的更多信息,请参阅 PostgreSQL 文档中的 VACUUM