我尝试使用 COPY 命令将数据加载到 Amazon Redshift 中的新表。我甚至添加了 COMPUPDATE OFF 参数。为什么 COPY ANALYZE 仍会运行?
简短描述
在 Amazon Redshift 中创建表之前,请选择表的分配方式。如果不指定表的分配方式,则默认为 AUTO 分配。Amazon Redshift 的 AUTO 分配功能随后将使用 COPY ANALYZE 进程确定该表的分配方式应使用 EVEN 还是 ALL。
**注意:**使用 AUTO 分配方式时,COMPUPDATE OFF 参数仍会在表上运行 COPY ANALYZE。STATUPDATE OFF 参数不会禁用或抑制 COPY ANALYZE 命令。
解决方法
1. 通过运行 SHOW TABLE 来验证表的当前分配方式:
SHOW TABLE [schema_name.]table_name
**注意:**默认情况下,如果 CREATE TABLE 语句中未指定分配方式,则 Amazon Redshift 会应用 AUTO 分配。
2. 如果启用了 AUTO 分配,则使用已定义的分配方式创建表。指定分配方式可防止 COPY ANALYZE 运行。
以下示例指定了 EVEN 分配方式:
create table rs_example_test (id int)diststyle even;
有关分配方式的更多信息,请参阅使用数据分配方式。
3. 使用 COPY 命令将数据加载到表中,然后为其附加 STATUPDATE OFF 参数。
**注意:**加载大量数据时最好使用 COPY 命令,而不是单独的 INSERT 语句。这样可以最大程度地减小出现性能问题的风险。
4. 在 SVL_STATEMENTTEXT 系统表上运行查询,然后筛选与会话相关的进程 ID(PID):
select userid, xid, pid, trim(label) as label, starttime, endtime, sequence, trim(type) as type, left(text,60) text from svl_statementtext where pid = 26815 order by xid, starttime, sequence;
上述语法检查 COPY ANALYZE 是否作为 COPY 事务的一部分运行。
输出与以下内容类似:
userid xid pid label starttime endtime sequence type text
100 78915 26815 default 2019-03-19 14:06:19 2019-03-19 14:06:21 0 QUERY copy rs_test3 from 's3://xxxxx-rs-log/AWSLogs/rs_test2.csv'\
100 78915 26815 default 2019-03-19 14:06:21 2019-03-19 14:06:21 0 UTILITY COMMIT
这表示确认 COPY ANALYZE 将不再作为 COPY 事务的一部分运行。
相关信息
使用暂存表执行合并(更新插入)