Snippets#
Cancelling every running queries#
SELECT
pg_cancel_backend(pid)
FROM
pg_stat_activity
WHERE
state <> 'idle'
AND query NOT ILIKE '%pg_stat_activity%'
Show running queries & locks blocking them with the nature and source of the lock#
SELECT
a.pid,
(
SELECT string_agg(
blocker.pid::text, ', '
)
FROM pg_locks blocked
JOIN pg_locks blocker ON blocker.locktype = blocked.locktype
AND blocker.DATABASE IS NOT DISTINCT FROM blocked.DATABASE
AND blocker.relation IS NOT DISTINCT FROM blocked.relation
AND blocker.page IS NOT DISTINCT FROM blocked.page
AND blocker.tuple IS NOT DISTINCT FROM blocked.tuple
AND blocker.virtualxid IS NOT DISTINCT FROM blocked.virtualxid
AND blocker.transactionid IS NOT DISTINCT FROM blocked.transactionid
AND blocker.classid IS NOT DISTINCT FROM blocked.classid
AND blocker.objid IS NOT DISTINCT FROM blocked.objid
AND blocker.objsubid IS NOT DISTINCT FROM blocked.objsubid
WHERE blocked.pid = a.pid AND NOT blocked.granted AND blocker.granted
) AS blocked_by,
a.wait_event_type,
(
SELECT string_agg(
l2.locktype || ':' ||
COALESCE((l2.relation::regclass)::text, '') ||
COALESCE(':tuple=' || l2.tuple::text, ''),
', '
)
FROM pg_locks l2
WHERE l2.pid = a.pid AND l2.granted = false
) AS locking_on,
a.state,
a.query,
a.query_start AS query_start_time,
age(now(), a.query_start) AS duration,
a.wait_event,
a.usename AS user,
a.client_addr,
a.client_port,
a.application_name
FROM
pg_stat_activity a
WHERE
a.state <> 'idle'
AND a.query NOT ILIKE '%pg_stat_activity%' -- Exclude this monitoring query itself
ORDER BY
duration DESC;
Cancel a query by PID#
SELECT pg_cancel_backend(<pid>);
List manually created tables#
SELECT
nsp.nspname as object_schema,
cls.relname as object_name,
rol.rolname as owner,
CASE cls.relkind
WHEN 'r' then 'TABLE'
WHEN 'm' then 'MATERIALIZED_VIEW'
WHEN 'i' then 'INDEX'
WHEN 'S' then 'SEQUENCE'
WHEN 'v' then 'VIEW'
WHEN 'c' then 'TYPE'
ELSE cls.relkind::text
END AS object_type
FROM
pg_class cls
JOIN pg_roles rol ON rol.oid = cls.relowner
JOIN pg_namespace nsp ON nsp.oid = cls.relnamespace
WHERE nsp.nspname NOT IN ('information_schema', 'pg_catalog')
AND nsp.nspname NOT LIKE 'pg_toast%'
AND rol.rolname NOT IN ('processor', 'rdsadmin', 'rds_superuser', 'postgres')
ORDER BY
nsp.nspname,
cls.relname
Credits to rgreenjr#
Show running queries (9.2)#
SELECT
pid,
age(clock_timestamp(), query_start),
usename,
query
FROM
pg_stat_activity
WHERE
query != '<IDLE>'
AND query NOT ILIKE '%pg_stat_activity%'
ORDER BY
query_start desc
Kill running query#
SELECT pg_cancel_backend(procpid);
Kill idle query#
SELECT pg_terminate_backend(procpid);
Vacuum command#
VACUUM (VERBOSE, ANALYZE);
All database users#
SELECT
*
FROM
pg_stat_activity
WHERE
current_query NOT LIKE '<%'
All databases and their sizes#
SELECT * FROM pg_user;
All tables and their size, with/without indexes#
SELECT
datname,
pg_size_pretty(pg_database_size(datname))
FROM
pg_database
ORDER BY
pg_database_size(datname) DESC
Cache hit rates (should not be less than 0.99)#
SELECT
SUM(heap_blks_read) AS heap_read,
SUM(heap_blks_hit) AS heap_hit,
(sum(heap_blks_hit) - sum(heap_blks_read)) / sum(heap_blks_hit) AS ratio
FROM
pg_statio_user_tables
Table index usage rates (should not be less than 0.99)#
SELECT
relname,
100 * idx_scan / (seq_scan + idx_scan) AS percent_of_times_index_used,
n_live_tup AS rows_in_table
FROM
pg_stat_user_tables
ORDER BY
n_live_tup DESC
How many indexes are in cache#
SELECT
SUM(idx_blks_read) AS idx_read,
SUM(idx_blks_hit) AS idx_hit,
(SUM(idx_blks_hit) - SUM(idx_blks_read)) / SUM(idx_blks_hit) AS ratio
FROM
pg_statio_user_indexes