Table Locking in PostgreSQL
我有一个PL / pgSQL函数,它将数据从登台表传递到我们的目标表。 该过程每晚执行。 有时由于服务器重启或某些维护问题,我们会手动执行流程。
我面临的问题是:每当我们在上午7点之后手动启动流程时,完成需要将近2个小时(从登台表读取并插入目标表)。 但是无论何时按照计划执行,即在早上7点之前,平均需要22-25分钟。
可能是什么问题? 如果需要,我可以在这里分享我的功能片段。
典型的原因是数据库中的一般并发活动,它与您的函数竞争相同的资源并可能导致锁争用。检查数据库日志,查看从早上7点左右开始的活动。
关于锁定监控的Postgres Wiki
函数始终作为单个事务运行。锁定是沿途获得的,仅在交易结束时释放。这使得长时间运行的功能特别容易受到锁争用的影响。
您可以优化一般性能以及并发事务的行为,以使其运行更快。或者更根本的是:如果可能的话,将您的大函数拆分为单独的部分,您可以在单独的事务中调用它们。
- PostgreSQL在存储函数中获取并释放LOCK
如何拆分巨大的更新:
- 如何在PostgreSQL中进行大型非阻塞更新?
将多个大型操作打包到单个函数时还需要考虑其他事项:
- 一起执行多个功能而不会降低性能