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 ANALYZESTATUPDATE 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 事务的一部分运行。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?