我想在 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 表被动态地分成小部分。
CREATE INDEX CONCURRENTLY
不能在事务内运行,并且所有函数都是事务,(但普通的创建索引可以)。
也许可以利用类似的东西PG_AGENT
来根据触发器的命令创建索引。
https://www.pgadmin.org/docs/pgadmin4/3.x/pgagent.html
或者,您可以在创建表时执行常规创建索引,在创建索引期间空表不会被长时间锁定。