【问题标题】:How to create index parallelly on two columns in postgres如何在postgres中的两列上并行创建索引
【发布时间】:2022-01-15 01:25:02
【问题描述】:

我想在有 5 亿行的表上创建两个索引,由于索引创建需要一些时间才能完成,我正在考虑并行运行两个索引语句,但我不知道如何,我想使用过程创建索引,这是我的功能:

CREATE OR REPLACE PROCEDURE test() LANGUAGE plpgsql AS $PROCEDURE$
BEGIN
   SET statement_timeout = 7200000;
   COMMIT;
   CREATE INDEX IF NOT EXISTS idx_tt1_org_id ON temp_table_1(org_id);
   CREATE INDEX IF NOT EXISTS idx_tt1_input_id ON temp_table_1(input_id);
END;$PROCEDURE$;

请帮助我如何并行运行这些索引语句。谢谢

【问题讨论】:

  • 与您的问题无关,但是:Postgres 9.1 是no longer supported,您应该尽快计划升级。
  • 你的意思是我可以创建两个过程,并在一个过程中移动一个创建索引语句,在另一个过程中移动另一个,并将创建索引查询更改为CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_tt1_org_id ON temp_table_1(org_id);
  • 基本上是的。但是,如果您的系统是 I/O 绑定的(这很可能),那么并行运行两个 CREATE INDEX 语句很可能会使事情变得更慢,而不是更快。
  • @a_horse_with_no_name 一个普通的索引创建只需要一个共享锁,不会阻塞其他同时进行的普通索引创建。 (但确实阻止了 INSERT/UPDATE/DELETE)。 CONCURRENTLY 创建索引时会阻塞其他 CONCURRENTLY 索引,但不会阻塞 INSERT/UPDATE/DELETE。
  • @jjanes:啊,谢谢。

标签: postgresql postgresql-9.1


【解决方案1】:

您需要打开两个会话并在每个会话中创建一个索引。所以你不能从一个程序中做到这一点。 (您也许可以通过使用 dblink 或让程序打开其他连接来解决这个问题。

现代数据库版本(不是长期 EOL 9.1)将自动并行创建单个 btree 索引,因此如果每个 btree 索引都已经并行创建,那么尝试同时创建多个索引可能没有多大意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2016-09-16
    • 2014-08-25
    • 2018-06-25
    • 2020-01-01
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多