Amazon Redshift 为什么在 STATUPDATE 关闭时运行 COPY ANALYZE 进程?
上次更新时间:2020 年 3 月 25 日
我尝试使用 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.在PG_CLASS_INFO 视图上运行查询,验证表的当前分配方式:
select relname, releffectivediststyle from PG_CLASS_INFo where relname = 'rs_example_test'
2.检查分配方式是否已设为 AUTO 分配:
select relname, releffectivediststyle from PG_CLASS_INFo where relname = 'rs_test2'
relname | releffectivediststyle
rs_test2 | 10
注意:如果releffectivediststyle 值为 10 或 11,则创建表时未指定分配方式。然后,Amazon Redshift 会将分配方式指定为 AUTO 分配。默认情况下,如果 CREATE TABLE 语句中未指定分配方式,则 Amazon Redshift 会应用 AUTO 分配。
3.如果启用了 AUTO 分配,则使用已定义的分配方式创建表。指定分配方式可防止COPY ANALYZE 运行。
以下示例指定了 EVEN 分配方式:
create table rs_example_test (id int)diststyle even;
有关分配方式的更多信息,请参阅选择数据分配方式。
4.使用 COPY 命令将数据加载到表中,然后为其追加STATUPDATE OFF 参数。
注意:加载大量数据时最好使用COPY 命令,而不是单独的 INSERT 语句。这样可以最大程度地减小出现性能问题的风险。
5.在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 事务的一部分运行。