Postgres中有不同类型的锁,我们在并行请求中使用锁,以防止不需要的行或数据一般被读/写.

假设我想测试我为查询设置的不同组合.例如select * from mytable where age > 12 and age < 45 for update;或类似的其他锁.

假设我用1000个请求轰炸我的psql数据库,有没有什么工具可以生成报告,告诉我与这些锁有关的不同统计数据?

  • 在请求I时遇到了锁,锁使该事务等待了x秒,锁在行xy上,锁的成本是多少?

推荐答案

您可以查看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 settingslogging 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;

还有一些外部工具,比如PgMonitorpganalyze,可以用来分析数据库的锁定行为.上面的日志(log)条目示例实际上来自关于该主题的pganalyze blog条.

Postgresql相关问答推荐

Postgres SQL执行加入

Postgis超过2个表的查询在运行时爆炸

如何使用docker/docker-compose转到本地主机?

无法在timscaleDb中创建Hypertable

可以向判断枚举值的SQL列添加约束吗?

未更改表上的 Postgres 环绕预防

查找行中的最小值

PostgresQL:获取两个数组之间的对应数量

如何在 postgresql 上使用 sqlalchemy 进行正确的 upsert?

新数据未保存到 Postgres 上的 Rails 数组列

如何 Select 任意行的相邻行(在 sql 或 postgresql 中)?

从具有加权行概率的 PostgreSQL 表中 Select 随机行

INSERT RETURNING 是否保证以 right的顺序返回?

Postgresql - 在 Big Data 库中使用数组的性能

SqlAlchemy:多列的不同计数

无法在 postgresql hibernate 中使用名为user的表

按任意时间间隔计算行数的最佳方法

如何在postgresql中编写关于最大行数的约束?

Android 的 JDBC 与 Web 服务

如何在postgres中将整数分钟转换为间隔