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



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

以前我复制过表DDL(它没有编码),分析过表,手动键入列编码,手动添加DIST和SORT键,创建了新表,插入了数据,删除了旧表,然后更改了新表。这相当耗时,而且容易出错。

有更好的方法吗?

Redshift自动对新的空表应用压缩。请注意,在这种情况下,它通常默认为LZO

可以在CREATE TABLE … AS查询中指定DISTKEYSORTKEY。因此,做你想做的事情最简单的方法是:

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

EDIT:为了保留现有的编码,请使用Utils库中的v_generate_tbl_ddl视图来获取带有编码的现有表的DDL。然后修改它以从旧表创建新的目标和INSERT INTO

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"
         )
 ;

您可以解析内置的元数据表"information_schema.tables"one_answers"information_schema.columns"(以及其他),以便以编程方式确定表定义。这样就可以完全自动创建新的表克隆,并将一个表中的所有行插入另一个表。

Amazon(AWS实验室)维护一个包含ColumnEncodingUtilityamazon-redshift-utils存储库,该存储库支持对分发和排序键的就地更新(除了优化现有表的列编码压缩的主要功能外)。

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

相关内容

  • 没有找到相关文章

最新更新