Postgres。通过拖放创建“重新索引”

时间:2018-09-20 09:22:02

标签: sql database postgresql

我们有一个非常庞大的数据库,其中的索引确实需要清理。我想使用的是Reindex函数,但这是不可能的,因为不支持'Concurrently'并且我们不能使用锁。

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

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

1 个答案:

答案 0 :(得分:2)

这是一个如何完成此操作的示例:

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;