AdvancedAdvanced PostgreSQL

Monitoring: lock contention and blocking queries

The query

SQL
-- Find blocked and blocking queries
SELECT
  blocked.pid AS blocked_pid,
  blocked.query AS blocked_query,
  blocking.pid AS blocking_pid,
  blocking.query AS blocking_query,
  blocking.usename AS blocking_user,
  NOW() - blocked.query_start AS blocked_duration
FROM pg_stat_activity blocked
JOIN pg_stat_activity blocking
  ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
WHERE cardinality(pg_blocking_pids(blocked.pid)) > 0;

-- Show all lock info
SELECT
  relation::regclass,
  mode,
  granted,
  pid
FROM pg_locks
WHERE relation IS NOT NULL
ORDER BY relation, mode;
Tested against PostgreSQL 16

Note

pg_blocking_pids() returns PIDs blocking a query. Essential for debugging lock contention in production.