我有以下问题:我有一张桌子,当然是在产品上。。。在某个时候,我们遇到了INT pk的限制,因此我们默认将其修改为-1。现在,我想在其上运行pg_repack,但是这需要没有NULL和唯一键。你有什么经验吗?我的选择:1.抽真空。不能,因为影响。2.添加一些额外的唯一列,可能会花费一些时间和影响。也可以破坏select *查询。3.添加具有默认值的列,然后使用序列号更新并标记为唯一。以前从未尝试过。AWS RDS。
将始终对性能产生影响,您的目标是使ACCESS EXCLUSIVE
锁越短越好。
所以
添加没有默认值的bigint
列
创建序列OWNED BY
新列
使用ALTER TABLE
使用序列设置列的默认值
更新序列中新列中的NULL值
您应该分批执行此操作,以避免一次锁定太多行。
在新列CONCURRENTLY
上创建唯一索引
使用新索引添加唯一约束
这不会给您主键,因为您仍然缺少NOT NULL
约束。如果不扫描整个表就无法设置列NOT NULL
,这将使ACCESS EXCLUSIVE
锁定时间更长。但是,如果您需要真正的主键,则无法避免。
这是我在SQL中使用示例表的过程:
ALTER TABLE x ADD id bigint;
CREATE SEQUENCE x_id_seq OWNED BY x.id;
ALTER TABLE x ALTER id SET DEFAULT nextval('x_id_seq');
UPDATE x SET id = nextval('x_id_seq')
WHERE id IS NULL
AND somecol BETWEEN 1 AND 10000;
UPDATE x SET id = nextval('x_id_seq')
WHERE id IS NULL
AND somecol BETWEEN 10001 AND 20000;
...
CREATE UNIQUE INDEX CONCURRENTLY x_id_idx ON x(id);
ALTER TABLE x ADD UNIQUE USING INDEX x_id_idx;
我希望下次您对它有所了解,并且永远不会再创建没有主键的表。