0

我有一个大约有 100,000,000 行的表。我们需要删除其中大约 80,000 个进行修复。

为了防止停机,我有一个作业设置来获取需要删除的记录,然后以 100 条为单位处理删除。但是,即使处理前 100 条记录也需要很长时间。

此表上没有主 ID,我可以可靠地引用每一行的唯一方法是使用一个名为txvarchar(250)` 的唯一列(尽管该字段永远不会超过 18-20 个字符)。我在这一行上创建了一个索引,但仍然需要大约 4-6 秒来选择一行。

似乎是 varchar 导致了问题,所以我想添加一个新id bigint serial列,但试图弄清楚这样做是否会锁定表,直到它能够填充所有 ID。

我知道alter table add column只要没有默认值,它就是非阻塞的。但是 Serial 算作default价值吗?

我在文档中找不到这个问题的答案。我们在 Postgres 12 上。

4

1 回答 1

0

添加具有序列生成值的新列将重写表,这将导致停机。稍加注意,它可以在没有停机时间的情况下完成,但是如果您已经有一个varchar具有唯一索引且不包含 NULL 值的列,那么这很复杂并且不值得付出努力。

使用现有索引搜索行应该是几毫秒的事情。如果不是,那就是你必须解决的问题。您可以EXPLAIN (ANALYZE, BUFFERS)将查询的输出添加到问题中吗?

于 2022-02-23T07:34:29.327 回答