Postgres中有不同类型的锁,我们在并行请求中使用锁,以防止不需要的行或数据一般被读/写.
假设我想测试我为查询设置的不同组合.例如select * from mytable where age > 12 and age < 45 for update
;或类似的其他锁.
假设我用1000个请求轰炸我的psql数据库,有没有什么工具可以生成报告,告诉我与这些锁有关的不同统计数据?
- 在请求I时遇到了锁,锁使该事务等待了x秒,锁在行xy上,锁的成本是多少?
Postgres中有不同类型的锁,我们在并行请求中使用锁,以防止不需要的行或数据一般被读/写.
假设我想测试我为查询设置的不同组合.例如select * from mytable where age > 12 and age < 45 for update
;或类似的其他锁.
假设我用1000个请求轰炸我的psql数据库,有没有什么工具可以生成报告,告诉我与这些锁有关的不同统计数据?
您可以查看pg_locks
以判断正在进行的事务使用的锁.你可以在PostgreSQL维基页面上找到a few examples.一百零二
datname | relation | query | query_start | age | transactionid | mode | granted | usename | pid |
---|---|---|---|---|---|---|---|---|---|
postgres | pg_locks | SELECT a.datname, l.relation::regclass, a.query, a.query_start, age(now(), a.query_start) AS "age", l.transactionid, l.mode, l.GRANTED, a.usename, a.pid FROM pg_stat_activity a JOIN pg_locks l ON l.pid = a.pid ORDER BY a.query_start; |
2023-10-09 09:30:30.221477+00 | 00:00:00 | null | AccessShareLock | t | postgres | 786 |
它是实时视图,不是记录表,但您可以调整lock management settings和logging parameters来让PostgreSQL将信息放入服务器日志(log)中:
LOG: process 663 still waiting for ExclusiveLock on advisory lock [233136,1,2,2] after 1000.365 ms
DETAIL: Process holding the lock: 660. Wait queue: 663.
STATEMENT: SELECT pg_advisory_lock(1, 2);
LOG: process 583 acquired AccessExclusiveLock on relation 185044 of database 16384 after 2175.443 ms
STATEMENT: ALTER TABLE x ADD COLUMN y text;
还有一些外部工具,比如PgMonitor和pganalyze,可以用来分析数据库的锁定行为.上面的日志(log)条目示例实际上来自关于该主题的pganalyze blog条.