在大型数据集上使用 ADD COLUMN 的含义
Posted
技术标签:
【中文标题】在大型数据集上使用 ADD COLUMN 的含义【英文标题】:Implications of using ADD COLUMN on large dataset 【发布时间】:2014-06-02 14:35:49 【问题描述】:Redshift 的文档说:
ALTER TABLE locks the table for reads and writes until the operation completes.
我的问题是: 假设我有一个包含 5 亿行的表,并且我想添加一列。这听起来像是一个繁重的操作,可能会长时间锁定表 - 是吗?或者它实际上是一个快速操作,因为 Redshift 是一个柱状数据库?还是取决于列是否可为空/具有默认值?
【问题讨论】:
【参考方案1】:我发现添加(和删除)列是一种非常快速的操作,即使在具有数十亿行的表上也是如此,无论是否存在默认值或它只是 NULL。
正如您所建议的,我相信这是它作为列式数据库的一个特性,因此表的其余部分不受干扰。它只是为每个节点上的新列创建空(或几乎空)列块。
【讨论】:
【参考方案2】:我最近在 Redshift 中为大约 6500 万行的表添加了一个默认整数列,处理过程大约需要一秒钟。这是在 dw2.large(SSD 类型)单节点集群上。
请记住,您只能在表的末尾(右侧)添加一列,如果您想在中间某处插入一列,则必须使用临时表等。
【讨论】:
【参考方案3】:我个人认为重建表效果最好。 我通过以下方式做到这一点
-
新建表N_OLD_TABLE表
在新表中定义数据类型/压缩编码
将数据插入 N_OLD(old_columns) select(old_columns) from old_table 将 OLD_Table 重命名为 OLD_TABLE_BKP
将 N_OLD_TABLE 重命名为 OLD_TABLE
这是一个更快的过程。不会阻塞任何表,并且您始终拥有旧表的备份,以防出现任何问题
【讨论】:
以上是关于在大型数据集上使用 ADD COLUMN 的含义的主要内容,如果未能解决你的问题,请参考以下文章