在Redshift中,如何复制表,添加dist和排序键以及保留列编码?

时间:2016-07-22 00:28:48

标签: sql amazon-redshift

我想在Redshift中复制一个表,这样我就可以保留现有的列编码,同时还可以添加DIST和SORT键。有一种简单的可重复方法吗?

以前我已经复制了表DDL(它没有编码),ANALYZED表,手动输入列编码,手动添加DIST和SORT键,创建新表,插入数据,删除旧的,然后改变了新的。这非常耗时且容易出错。

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

Redshift automatically applies compression to new empty tables. Note that it typically defaults to LZO in this situation.

You can specify the DISTKEY and SORTKEY in a CREATE TABLE … AS query. So the simplest way to do what you want is:

CREATE TABLE new_table 
DISTKEY(new_dist_col) 
SORTKEY(new_sortkey_1, new_sortkey_2)
AS 
SELECT * FROM old_table;

EDIT: To keep existing encodings, use the v_generate_tbl_ddl view from our Utils library to get DDL of existing table with encoding. Then modify it to create the new target and INSERT INTO from the old table.

SELECT ddl 
FROM admin.v_generate_tbl_ddl 
WHERE tablename = 'old_table'
;
                   ddl
-------------------------------------------------
 --DROP TABLE "my_schema"."old_table";
 CREATE TABLE IF NOT EXISTS "my_schema"."old_table"
 (
         "dist_col" BIGINT   ENCODE zstd
         ,"sortkey_2" TIMESTAMP
         ,"sortkey_1" NUMERIC(28,4)   ENCODE zstd
         ,"column_d" VARCHAR(256)   ENCODE zstd
 )
 DISTSTYLE KEY
 DISTKEY ("dist_col")
 SORTKEY (
         "sortkey_2"
         "sortkey_1"
         )
 ;

答案 1 :(得分:0)

您可以解析内置元数据表“information_schema.tables”和“information_schema.columns”(和其他),以便以编程方式确定表定义。然后可以完全自动创建新的表克隆,并将所有行从一个表插入另一个表。

答案 2 :(得分:0)

亚马逊(AWS Labs)维护一个amazon-redshift-utils存储库,其中包含ColumnEncodingUtility,支持就地Updates to Distribution and Sort Keys(除了优化列编码压缩的主要功能外)对于现有表格。)

此实用程序只执行您的问题中概述的迁移过程(基于原始DDL创建新表,更新列编码和DIST / SORT键,使用INSERT ... SELECT ...迁移数据,然后重命名新表替换旧的)。但是,该实用程序完全自动化了该过程,并且由亚马逊正式维护,因此每次手动执行这些步骤时不容易出错。