【问题标题】:How can I copy a Redshift table but add a sortkey to a column?如何复制 Redshift 表但将排序键添加到列?
【发布时间】:2014-10-19 04:41:21
【问题描述】:

我目前正在处理一个使用包含 51 列的 Redshift 表的项目。但是,创建表格的人忘记在我们的time 列中添加排序键,如果我们不添加它会影响我们用例的性能。

如何使用time 列作为排序键来制作表格版本?我知道你can't make a column a sortkey if its a member of an existing table,但我希望有一种方法可以做到这一点,而不需要手动写出CREATE TABLE 语法;例如,这样的事情会很好:

timecube=# CREATE TABLE foo (like bar) sortkey(time);
ERROR:  CREATE TABLE LIKE is not supported with DISTSTYLE, DISTKEY(), or SORTKEY() clauses

但正如您所见,它不受支持。还有其他方法吗?由于我们仍在开发中,我们不需要任何现有数据。

使用像 pgdump 这样的传统工具效果不佳,因为它们不包含任何 Redshift 额外功能,如编码。

【问题讨论】:

    标签: sql postgresql amazon-redshift


    【解决方案1】:

    第一步,您需要对现有表使用 get create table 语句。然后创建新表,这次将排序键添加到新表中。

    检查旧表的编码(当您使用复制命令加载数据时,它会自动添加压缩编码)

    select "column", type, encoding 
    from pg_table_def where tablename = 'old_table'
    

    创建新表时,为每一列添加编码类型。使用排序键创建表。

    创建新表后,使用以下命令

    插入新表(按时间从旧表中选择* asc)

    【讨论】:

      【解决方案2】:

      Redshift 支持将 DIST 和 SORT 键指定为 CREATE TABLE AS 语句的一部分,as per the docs.

      CREATE TABLE table_name
      DISTSTYLE KEY
      DISTKEY ( column )
      SORTKEY ( column )
      AS 
      (SELECT * 
      FROM source_table)
      ;
      

      【讨论】:

      • 我在 select 子句周围添加了括号(没有它们就无法工作)
      • Welp,它适用于我,例如,psql,但一些 SQL 客户端不会提交它。
      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2022-01-06
      • 2018-03-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多