Table 在 PostgreSQL 中锁定

Table Locking in PostgreSQL

我有一个 PL/pgSQL 函数,它从暂存 table 中获取数据到我们的目标 table。该过程每晚执行。有时由于服务器重启或一些维护问题,我们手动执行该过程。

我面临的问题:每当我们在早上 7 点后手动启动该过程时,都需要将近 2 个小时才能完成(从暂存 table 读取并插入目标 table)。但是只要按计划执行,即早上 7 点之前,平均需要 22-25 分钟。

可能是什么问题?如果需要,我可以在这里分享我的功能片段。

典型的原因是数据库中的一般并发 activity,它与您的函数竞争相同的资源,并可能导致锁争用。检查您的数据库日志以了解 7 a.m.

左右开始的活动

函数总是 运行 作为 单个事务 。锁是一路获取的,只有在事务结束时才释放。这使得长 运行ning 函数特别容易受到锁争用的影响。

您可以优化一般性能以及针对并发事务的行为,以使其 运行 更快。或者更彻底:如果可能的话,将你的大功能拆分成不同的部分,你在 separate transactions.

中调用它们

如何拆分大量更新:

  • How do I do large non-blocking updates in PostgreSQL?

将多个大操作打包到一个函数中时,还需要考虑其他事项: