关于性能:PostgreSQL中的表锁定

Table Locking in PostgreSQL

我有一个PL / pgSQL函数,它将数据从登台表传递到我们的目标表。 该过程每晚执行。 有时由于服务器重启或某些维护问题,我们会手动执行流程。

我面临的问题是:每当我们在上午7点之后手动启动流程时,完成需要将近2个小时(从登台表读取并插入目标表)。 但是无论何时按照计划执行,即在早上7点之前,平均需要22-25分钟。

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


典型的原因是数据库中的一般并发活动,它与您的函数竞争相同的资源并可能导致锁争用。检查数据库日志,查看从早上7点左右开始的活动。

关于锁定监控的Postgres Wiki

函数始终作为单个事务运行。锁定是沿途获得的,仅在交易结束时释放。这使得长时间运行的功能特别容易受到锁争用的影响。

您可以优化一般性能以及并发事务的行为,以使其运行更快。或者更根本的是:如果可能的话,将您的大函数拆分为单独的部分,您可以在单独的事务中调用它们。

  • PostgreSQL在存储函数中获取并释放LOCK

如何拆分巨大的更新:

  • 如何在PostgreSQL中进行大型非阻塞更新?

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

  • 一起执行多个功能而不会降低性能