CockroachDB:将唯一约束转换为主键的最佳方法?

问题描述 投票:0回答:1

我们在 CockroachDB 中有一个表,它的 PK 总是有 2 个额外的列前缀,例如

(u1, u2, id)
,现在不再需要了。

为了性能,还设置了真正的主键作为唯一约束。

    CONSTRAINT table1_pk PRIMARY KEY (u1, u2, id),
    CONSTRAINT table1_ck_id UNIQUE (id)

我想从表格中删除

u1
u2

问题是表有时有数十亿个条目,重新索引将需要相当长的时间。 Cockroach DB 不支持

CONCURRENTLY
,所以据我所知,这会长时间阻塞
UPDATE
查询。

我已经确定了 3 种方法来做到这一点:

A)“提升”对主键的唯一约束。这可能行不通。

ALTER TABLE tnt.xxx DROP CONSTRAINT xxx_pk;
ALTER TABLE tnt.xxx ADD CONSTRAINT xxx_pk PRIMARY KEY USING INDEX xxx_pk_id;
ALTER TABLE tnt.xxx DROP CONSTRAINT xxx_pk_id;
ALTER TABLE tnt.xxx DROP COLUMN u1, DROP COLUMN u2;

B) 更改 PK 列。请参阅https://www.cockroachlabs.com/docs/stable/primary-key#changing-primary-key-columns

ALTER TABLE tnt.xxx ALTER PRIMARY KEY USING COLUMNS (id);
ALTER TABLE tnt.xxx DROP CONSTRAINT xxx_ck_id;
ALTER TABLE tnt.xxx DROP COLUMN u1, DROP COLUMN u2;

C) 在一个事务中删除和添加主键。请参阅https://www.cockroachlabs.com/docs/v23.2/alter-table#drop-and-add-a-primary-key-constraint

ALTER TABLE tnt.xxx DROP CONSTRAINT xxx_pk;
ALTER TABLE tnt.xxx ADD CONSTRAINT xxx_pk PRIMARY KEY (id);
ALTER TABLE tnt.xxx DROP CONSTRAINT xxx_ck_id;
ALTER TABLE tnt.xxx DROP COLUMN u1, DROP COLUMN u2;

还有其他办法吗?
哪一款性能最好?

迁移发生在事务中。因此,这不应该让表在没有 PK 的情况下发生在此期间发生的 SELECT。

sql primary-key cockroachdb sql-drop
1个回答
0
投票

CRDB 中的架构更改始终是在线且非阻塞的,因此不必担心 IUD 操作会卡在任何 ALTER TABLE 命令后面。请参阅:https://www.cockroachlabs.com/docs/stable/online-schema-changes

实际上,如果您正在执行活动的工作负载,运行上述序列您唯一关心的是对吞吐量的影响。最好的做法是使用隐式事务(请参阅上面链接中的注释,不完全支持显式事务)。然后直接执行:

ALTER TABLE tnt.xxx ALTER PRIMARY KEY USING COLUMNS (id);
ALTER TABLE tnt.xxx DROP COLUMN u1, DROP COLUMN u2;

进行在线模式更改时的影响主要是写入操作,因为回填将表现出一种称为双写入的现象(即每次写入都会写入旧的和新的主索引)。

© www.soinside.com 2019 - 2024. All rights reserved.