Redshift:当源表中有自动排序键时,创建表失败

Posted

技术标签:

【中文标题】Redshift:当源表中有自动排序键时,创建表失败【英文标题】:Redshift : create table like fails when there is AUTO sort key in source table 【发布时间】:2021-03-28 16:36:38 【问题描述】:

我正在尝试使用 redshift 创建一个临时表

CREATE TABLE tmp_users (LIKE users);

这工作了一段时间。但最近我在生产中遇到了如下故障。

org.postgresql.util.PSQLException: ERROR: Invalid syntax: Create table sortkey auto with initial sortkeys.

在 CREATE TABLE 查询执行期间,我的源表没有提供排序键。因此,根据 redshift 文档,它们将具有默认的 AUTO SORTKEY。来自 SVV_TABLE_INFO

  table   | diststyle |  sortkey1         
--------------------------------------
  users   | AUTO(ALL) | AUTO(SORTKEY)

对上述源表架构执行 LIKE 查询不会导致任何问题。

但我在生产表中看到 sortkey1 更改为 usersAUTO(SORTKEY(c1)) 的列之一并在此架构上执行 LIKE 会导致上述异常。

我的问题是

    作为自动性能调整的一部分,redshift 是否更改了排序键? 为什么 LIKE 在这种情况下会失败?如果是预期的.. 我该如何创建表格副本?

我提到了问题nvalid syntax: Create table sortkey auto with initial sortkeys,但在我的情况下,建议的删除排序键的解决方案是不可能的,因为表有数百万条记录。

【问题讨论】:

【参考方案1】:

我有同样的问题。 create table like 失败的原因是原始表具有自动排序键,而 Redshift 自动为该表生成了一些特定的排序键。

显然,由于性能问题,无法删除 sortkey。

这种情况下的解决方案是更改 sortkey 并强制它与 Redshift 自动生成的完全相同。

缺点: Redshift 将不再自动更改此表的 sorkey,您必须监控此表的用例并手动应用最佳排序键。 优点: 您可以使用此表元数据创建其他表(create table like)

【讨论】:

以上是关于Redshift:当源表中有自动排序键时,创建表失败的主要内容,如果未能解决你的问题,请参考以下文章

当源表的一行中的多个列与目标表中单行的相同列匹配时,从目标 spark delta 表中删除一行

需要从源表中获取布尔类型列作为 varchar 并在 Amazon redshift 的目标表中存储为 varchar

使用 T-SQL Merge 语句时如何避免插入重复记录

Redshift:连接到由表中的 SELECT * 组成的子查询/CTE 相当于连接表本身,还是性能下降?

ODI修改主键后刷新失败解决方案

Redshift COPY 并自动创建表?