【发布时间】: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:啊,谢谢。