【问题标题】:How do I drop all invalid indexes in postgres?如何删除 postgres 中的所有无效索引?
【发布时间】:2021-10-07 20:36:09
【问题描述】:

使用这个查询:

我有数百个无效索引:

SELECT * FROM pg_class, pg_index WHERE pg_index.indisvalid = false AND pg_index.indexrelid = pg_class.oid;

 public  | post_aggregates_pkey_ccnew_ccnew_ccnew1
 public  | post_aggregates_post_id_key_ccnew_ccnew_ccnew1
 public  | idx_post_aggregates_stickied_hot_ccnew_ccnew_ccnew1
 public  | idx_post_aggregates_hot_ccnew_ccnew_ccnew1
...

它们似乎没有被使用,我不知道为什么要创建它们(在我看来它们不应该保留),因为原始索引仍然存在。

【问题讨论】:

    标签: postgresql indexing reindex


    【解决方案1】:

    您需要在函数中使用dynamic commandsanonymous code block.

    do $$
    declare
        rec record;
    begin
        for rec in
            select relnamespace::regnamespace as namespace, relname
            from pg_index i
            join pg_class c on c.oid = i.indexrelid
            where not indisvalid
        loop
            execute format('drop index %s.%s', rec.namespace, rec.relname);
            -- optionally:
            -- raise notice '%', format('drop index %s.%s', rec.namespace, rec.relname);
        end loop;
    end $$;
    

    CREATE TABLEALTER TABLE 中创建或更改表约束时,Postgres 会自动创建索引。除此之外,它从不自行创建索引。

    无效索引的最可能原因是不小心使用了CREATE [UNIQUE] INDEX CONCURRENTLY 命令。在并行事务中执行命令时,很有可能出现死锁,从而导致命令失败并留下无效索引。同时创建唯一索引时,违反唯一性也可能导致失败。

    并发索引应由知道自己在做什么的管理员密切控制,尤其是在定期自动执行时。

    阅读更多the documentation.

    【讨论】:

    • 谢谢!附带说明一下,知道为什么 postgres 会自行创建然后不删除它们吗?
    • @thouliha - 查看更新后的答案。
    猜你喜欢
    • 2016-03-04
    • 2012-01-31
    • 2019-03-06
    • 2015-04-04
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    相关资源
    最近更新 更多