我有一个包含超过 30m 条记录的数据库,我需要向数据库添加两个新列。问题是我需要这些列不为空,并且没有默认值。我以为我只需添加这些没有 NOT NULL 约束的列,用数据填充它们,然后添加约束,但 Redshift 不支持这一点。我心里有另一个解决方案,但我想知道是否有比这更简单的解决方案?
- 使用 NOT NULL 和 DEFAULT 创建两个新列
- 用数据填充列
- 创建一个与目标数据库具有相同列的空表。 (当然,两个新列只是 NOT NULL)
- 将目标数据库中的所有内容插入到新数据库中。
- 删除目标数据库
- 将新数据库重命名为目标。
我会建议:
- 现存的
Table-A
- 创建一个新的
Table-B
包含新列,加上一个标识列(例如customer_id
) 匹配Table-A
.
- 将数据插入
Table-B
(2列+标识列)
- Use
CREATE TABLE AS
同时创建一个新的Table-C
(指定 DISTKEY 和 SORTKEY)查询时Table-A
and Table-B
通过身份列上的 JOIN
- 验证内容
Table-C
- VACCUM
Table-C
(应该不是必需的,但以防万一,而且应该很快)
- Delete
Table-A
and Table-B
- Rename
Table-C
到所需的表名称(可能与Table-A
)
总之:现有列Table-A
+ 中的额外列Table-B
➞ Table-C
推理:
-
UPDATE
语句在 Redshift 中运行得不太好。它需要将每列的现有数据行标记为“已删除”,然后将新行附加到每列的末尾。进行大量的 UPDATES 操作会导致表的大小过大,并且表将变得未排序。它也相对较慢。之后您需要对表进行深度复制或 VACUUM 来修复问题。
- Using
CREATE TABLE AS
使用 JOIN 将在一个查询中生成所有“最终状态”数据,并且结果表将被排序并处于“干净”状态
- 该过程使您有机会验证内容
Table-C
在进行切换之前。对于调试过程非常方便!
也可以看看:执行深度复制 - Amazon Redshift https://docs.aws.amazon.com/redshift/latest/dg/performing-a-deep-copy.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)