我们有一个非常庞大的数据库,其中的索引确实需要清理。我想使用的是Reindex函数,但这是不可能的,因为不支持'Concurrently'并且我们不能使用锁。
所以我想到的是找到所有索引,并为每个索引创建一个新的temp_index(同时,因此不会有锁)。然后删除旧索引,并将temp_index重命名为index。
现在,我在尝试删除旧索引时遇到了另一个问题,postgres抱怨约束,我不知道该如何解决。当然,这些约束必须存在并可以更新,或者需要一些连接到新索引的约束。这就是我碰壁的地方,我不知道如何解决这个问题。任何帮助将不胜感激。
答案 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;