Amazon Redshift
数据库开发人员指南 (API 版本 2012-12-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Vacuum 列限制超出错误

如果 vacuum 失败并显示消息 ERROR: 1036 DETAIL: Vacuum column limit exceeded,则表示表的列数超过了 VACUUM 的可用内存可处理的列数。ERROR: 1036: Detail: vacuum_max_buffer is too small to vacuumvacuum 列限制低于 CREATE TABLE 的列限制 (即 1600)。vacuum 的实际列限制因 vacuum 操作和群集配置而异。除了用户定义的列之外,列限制还包括三个隐藏的系统列。

如果需要重新排序的 vacuum 操作 (在具有排序键的表上执行 VACUUM FULL、VACUUM REINDEX 和 VACUUM SORT) 超过了列限制,则 vacuum 将会失败,并出现以下错误。

ERROR: 1036 DETAIL: Vacuum column limit exceeded

下表显示了当 vacuum 需要重新排序时每个节点类型的大致列限制。

节点类型 列限制
dc1.large 250
dc1.8xlarge 312
dc2.large 375
dc2.8xlarge 468
ds2.xlarge 375
ds2.8xlarge 468

如果超出仅删除 vacuum 操作的列限制,则 vacuum 将失败,并出现以下错误。

ERROR: 1036: Detail: vacuum_max_buffer is too small to vacuum

下表显示了仅删除 vacuum 操作的每个节点类型的大致列限制。

节点类型 列限制
dc1.large 500
dc1.8xlarge 500
dc2.large 750
dc2.8xlarge 1250
ds2.xlarge 750
ds2.8xlarge 1250

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

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

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

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 操作将成功。

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

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

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 属性。有关不同的深层复制方法的比较,请参阅执行深层复制