在更新整个表之前暂时禁用索引

pmi*_*hna 3 postgresql index update pg-restore amazon-rds

出于测试目的,我使用pg_restore. 在新数据库中,我运行匿名化敏感数据的 SQL 查询。但是,像下面这样的查询会更新一个表中超过 2000 万条记录,该表具有约 10 个索引(在 期间创建pg_restore)。

UPDATE users SET email = users.id || '@example.com',
phone_number = NULL;
Run Code Online (Sandbox Code Playgroud)

这需要几个小时的当前设置。

为了加快速度,我想为了运行而禁用表的索引update,然后再次启用它们并重新索引表。我怎样才能做到这一点?还有其他方法可以加快速度UPDATE吗?

笔记:

  1. 我试过了

    UPDATE pg_index
    SET indisready=false
    WHERE indrelid = (
        SELECT oid
        FROM pg_class
        WHERE relname='users'
    );
    
    Run Code Online (Sandbox Code Playgroud)

但得到了下面的错误。

ERROR:  permission denied for relation pg_index
Run Code Online (Sandbox Code Playgroud)

显然,您不能在 AWS RDS PostgreSQL 实例中以超级用户身份执行此操作。

  1. 删除索引然后再次创建它们会很不方便,因为我必须提前知道它们涵盖哪些列。理想情况下,我会有一个命令将现有的索引配置存储在某个临时变量中,然后使用此信息重新创建它们。

jja*_*nes 5

还原数据时,请使用pg_restore --section=pre-data --section=data. 这将忽略索引。

然后运行你想要的更新,然后运行 pg_restore --section=post-data