Postgresql 博士后:了解获得锁的时间

Postgresql 博士后:了解获得锁的时间,postgresql,postgresql-9.3,postgresql-9.5,Postgresql,Postgresql 9.3,Postgresql 9.5,我目前正在使用Postgres作为应用程序的数据库引擎 我目前的情况是,我有很多读锁(AccessSharedLocks)。我运行以下查询以检查锁: SELECT t.schemaname, t.relname, l.locktype, l.page, l.virtualtransaction, l.pid, l.mode, l.granted FROM pg_locks l JOIN pg_stat_all_tables t ON l.relation = t.relid WHERE t.s

我目前正在使用Postgres作为应用程序的数据库引擎

我目前的情况是,我有很多读锁(AccessSharedLocks)。我运行以下查询以检查锁:

SELECT t.schemaname,
t.relname,
l.locktype,
l.page,
l.virtualtransaction,
l.pid,
l.mode,
l.granted
FROM pg_locks l
 JOIN pg_stat_all_tables t ON l.relation = t.relid
WHERE t.schemaname <> 'pg_toast'::name AND t.schemaname <> 'pg_catalog'::name
选择t.schemaname,
t、 雷尔纳姆,
l、 锁式,
l、 第页,
l、 虚拟交易,
l、 pid,
l、 模式,
l、 同意
来自pg_locks l
在l.relation=t.relid上连接pg_stat_all_表t
其中t.schemaname'pg_toast':name和t.schemaname'pg_catalog':name
我想知道的是一个表获得锁的时间有多长。有什么方法可以检索这些信息吗


提前感谢。

在PostgreSQL中,获取锁的时间不可用

您最好从
pg_stat_activity
获取事务开始时间
xact_start
,这是锁龄的下限

事务应该总是短的,因为长事务持有锁并阻止autovacuum执行其工作


如果您有任何长时间运行的事务,这可能是您必须解决的问题。那么锁就不会有这样的问题。

此视图()可能会帮助您解决问题,您需要保存事务开始时间的
xact\u start
列`。。。然后您可以简单地计算o我修改上述查询以加入pid列上的pg_stat_activity表以使用此属性是否正确?是的,您需要加入pid列上的pg_stat_activity视图确定谢谢。因此,就我的理解而言,通过使用这个xact_start字段,这是否等同于表示这是用于此事务的进程获取锁的时间?
xact_start
显示此进程的当前事务**启动**的
时间,或者如果没有事务处于活动状态,则显示null。如果当前查询是其事务的第一个,则此列等于查询开始列。
锁定时间可能不同于理论中的锁定开始时间。非常感谢劳伦斯和雷蒙德