🐘 PostgreSQL Intermediate

How do you find and kill long-running queries in PostgreSQL?

Answer

Find long-running queries: SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state FROM pg_stat_activity WHERE (now() - pg_stat_activity.query_start) > INTERVAL '5 minutes' AND state = 'active';. Cancel a query (sends SIGINT, allows graceful cleanup): SELECT pg_cancel_backend(pid);. Terminate the connection (sends SIGTERM): SELECT pg_terminate_backend(pid);. Kill all idle-in-transaction connections older than 5 minutes: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle in transaction' AND query_start < NOW() - INTERVAL '5 minutes';. Set idle_in_transaction_session_timeout in postgresql.conf to automatically terminate such sessions. Always investigate the cause of long queries before killing — they may indicate missing indexes or lock contention.