Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Vacuum 列限制超出错误

如果 vacuum 失败并显示消息 ERROR: 1036 DETAIL: Vacuum column limit exceeded,则表示表的列数超过了 VACUUM 的可用内存可处理的列数。Vacuum 列限制低于表的最大列数(即 1600)。Vacuum 的实际列限制因集群的配置而异。例如,在具有 DC1 或 DS1 节点类型的集群上,您通常可以对包含多达约 500 个列的表执行 VACUUM 操作。对于 DS2 节点类型,DS2.xlarge 的限制可能高达 750 列,DS2.8xlarge 集群可能高达 1000 列。

您可以通过增大 wlm_query_slot_count 的值来提高 vacuum 列限制,这将增加对查询可用的内存量。wlm_query_slot_count 的最大值限制为队列的并发值。有关更多信息,请参阅 查询设计最佳实践

如果无法选择增加 wlm_query_slot_count 的值,或者该选项不能解决问题,则可通过执行深层复制来消除对 vacuum 的需求。要执行深层复制,您应创建表的副本,将原始表中的行插入该副本,删除原始表,然后重新命名该副本。深层复制通常比 vacuum 快得多。有关更多信息,请参阅 执行深层复制

例如,假设表 calendardays 具有 365 个列。在加载操作后,您执行了 vacuum 操作,但该 vacuum 操作失败,如以下示例所示。

Copy
vacuum calendardays; An error occurred when executing the SQL command: vacuum calendardays; ERROR: 1036 DETAIL: Vacuum column limit exceeded for table calendardays HINT: Increase the value of wlm_query_slot_count or perform a deep copy instead of a vacuum.

以下示例将 wlm_query_slot_count 设置为 10,执行 vacuum 操作,然后将 wlm_query_slot_count 重置为 1。在槽位计数较高的情况下,vacuum 操作将成功。

Copy
set wlm_query_slot_count to 10; vacuum calendardays; set wlm_query_slot_count to 1; vacuum executed successfully

您可以执行深层复制而不是执行 vacuum 操作。以下示例使用 CREATE TABLE LIKE 执行深层复制。

Copy
create table likecalendardays (like calendardays); insert into likecalendardays (select * from calendardays); drop table calendardays; alter table likecalendardays rename to calendardays;

使用 CREATE TABLE AS (CTAS) 执行深层复制比使用 CREATE TABLE LIKE 执行深层复制的速度更快,但 CTAS 不会保留父表的排序键、编码、distkey 和 notnull 属性。有关不同的深层复制方法的比较,请参阅执行深层复制