PostgreSQL-在多个分区表上创建索引

PostgreSQL-在多个分区表上创建索引,postgresql,indexing,database-partitioning,database-deadlocks,Postgresql,Indexing,Database Partitioning,Database Deadlocks,我试图在多个(1000)分区表上创建索引。因为我使用的是Postgres10.2,所以我必须对每个分区分别执行此操作,必须对相同的分区执行1000个查询 我已经想到了如何做到这一点,而且它在表大小和事务数非常少的环境中也能工作。下面是对其中一个表执行的查询(对所有表(用户_2、用户_3等)重复执行该查询) 其中,user_数据是一个jsonb列 当我一次对所有表运行此查询时,此查询不适用于具有大量事务的大型表。引发错误: ERROR: SQL State : 40P01 Error Code

我试图在多个(1000)分区表上创建索引。因为我使用的是Postgres10.2,所以我必须对每个分区分别执行此操作,必须对相同的分区执行1000个查询

我已经想到了如何做到这一点,而且它在表大小和事务数非常少的环境中也能工作。下面是对其中一个表执行的查询(对所有表(用户_2、用户_3等)重复执行该查询)

其中,user_数据是一个jsonb列

当我一次对所有表运行此查询时,此查询不适用于具有大量事务的大型表。引发错误:

ERROR: SQL State  : 40P01
Error Code : 0
Message    : ERROR: deadlock detected
Detail: Process 77999 waits for ShareLock on relation 1999264 of database 16311; blocked by process 77902.
Process 77902 waits for RowExclusiveLock on relation 1999077 of database 16311; blocked by process 77999
我能够以小批量(每个25个)运行它—有时仍会遇到问题,但在重试一次或两次后运行成功。批越小,死锁的可能性越小


我认为发生这种情况是因为所有用户表(user_1、user_2等)都链接到父表user。我不想在创建索引时锁定整个表(因为理论上一次只修改一个表)。为什么会发生这种情况?有没有办法确保创建索引时不会出现死锁?

并发使用如何?它需要更长的时间,但应该适用于其他进程使用的表。如果您想使用分区,我非常建议您至少升级到v12。@LaurenzAlbe确实,这是在路线图中(升级到v12)但目前还不可能,因为我们需要找到一个解决方案,继续使用v10.2。你只是给自己带来了不必要的痛苦。首先升级。这不是自PostgreSQL在v10中使用分区以来得到巨大改进的唯一分区功能。@FrankHeikens这似乎是一个可能的解决方案。从文档中,他们说我t将等待当前事务完成—在我的情况下,如果我将索引(并发地)应用于其中一个子表—它将等待此子表的所有事务完成—还是必须等待父表完成—因为它们是链接的?
ERROR: SQL State  : 40P01
Error Code : 0
Message    : ERROR: deadlock detected
Detail: Process 77999 waits for ShareLock on relation 1999264 of database 16311; blocked by process 77902.
Process 77902 waits for RowExclusiveLock on relation 1999077 of database 16311; blocked by process 77999