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;Note
“pg_blocking_pids() returns PIDs blocking a query. Essential for debugging lock contention in production.