Postgresql 并发创建索引

Joa*_*oag 6 postgresql index

我想在 postgresql 中的触发器中创建一个并发索引,如以下代码

    CREATE OR REPLACE FUNCTION hour_production_index_partition(partition_name text) RETURNS VOID AS
$BODY$
BEGIN
    -- Ensure we have all the necessary indices in this partition;
    EXECUTE 'CREATE INDEX CONCURRENTLY IF NOT EXISTS ' || partition_name || '_domain_write_date_idx ON ' || partition_name || ' (fk_domain, write_date)';
    END;
$BODY$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

问题是,当我执行该语句时,postgresql 抱怨发送类似

WARN SqlExceptionHelper - SQL错误:0,SQLSTATE:25001错误SqlExceptionHelper - ERROR:CREATE INDEX不能同时在一个事务块里面在哪里运行:SQL语句 “CREATE INDEX CONCURRENTLY IF NOT EXISTS hour_production_1_2018_07_01_domain_write_date_idx ON hour_production_1_2018_07_01(fk_domain,write_date)”

我需要以这种方式创建这个索引,因为 hour_production 表被动态地分成小部分。

Jas*_*sen 1

CREATE INDEX CONCURRENTLY不能在事务内运行,并且所有函数都是事务,(但普通的创建索引可以)。

也许可以利用类似的东西PG_AGENT来根据触发器的命令创建索引。

https://www.pgadmin.org/docs/pgadmin4/3.x/pgagent.html

或者,您可以在创建表时执行常规创建索引,在创建索引期间空表不会被长时间锁定。

  • @Joag根据插入数据的大小和业务(查询新分区表的频率),我认为您在创建表时应该考虑“创建索引”。请注意,如果您的表有很多活动,“同时创建索引”将花费很长时间。 (2认同)