首页 > 解决方案 > 邮递员。're-index' 使用 drop 和 create

问题描述

我们有一个相当大且使用量很大的数据库,其中的索引确实需要一些清理。我想使用的是 Reindex 功能,但这是不可能的,因为不支持“并发”并且我们不能使用锁。

所以我想出的是找到所有索引,并为每个索引创建一个新的 temp_index (同时不会有锁)。然后删除旧索引并将 temp_index 重命名为 index。

现在我遇到了另一个问题,在尝试删除旧索引时,postgres 抱怨约束,我不知道如何解决这个问题。这些约束当然需要存在并更新或连接到新索引。这就是我碰壁的地方,我不知道如何解决这个问题。任何帮助将非常感激。

标签: sqldatabasepostgresql

解决方案


这是一个如何做到这一点的示例:

CREATE TABLE tab (id integer CONSTRAINT tab_pkey PRIMARY KEY);

现在让我们“ REINDEX CONCURRENTLY”:

CREATE UNIQUE INDEX CONCURRENTLY tab_pkey_temp ON tab (id);

BEGIN;

ALTER TABLE tab DROP CONSTRAINT tab_pkey;

ALTER INDEX tab_pkey_temp RENAME TO tab_pkey;

ALTER TABLE tab ADD CONSTRAINT tab_pkey PRIMARY KEY USING INDEX tab_pkey;

COMMIT;

推荐阅读