Last active
July 29, 2024 07:34
-
-
Save akaashanky/927d1ea40eed6a8982f8ec94fb715dc5 to your computer and use it in GitHub Desktop.
A few useful queries for Postgres admins
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- See how long the currrently active txns have been running for | |
SELECT now()-xact_start, * FROM pg_stat_activity; | |
-- pg_stat_activity is a very useful table in general | |
-- eg. you can also see a summary of how many txns are currently running and | |
-- in what state | |
SELECT state, count(*) FROM pg_stat_activity GROUP BY state; | |
-- terminate process | |
SELECT pg_terminate_backend(pid); | |
-- cancel process | |
SELECT pg_cancel_backend(pid); | |
-- cache hits | |
with | |
all_tables as | |
( | |
SELECT * | |
FROM ( | |
SELECT 'all'::text as table_name, | |
sum( (coalesce(heap_blks_read,0) + coalesce(idx_blks_read,0) + coalesce(toast_blks_read,0) + coalesce(tidx_blks_read,0)) ) as from_disk, | |
sum( (coalesce(heap_blks_hit,0) + coalesce(idx_blks_hit,0) + coalesce(toast_blks_hit,0) + coalesce(tidx_blks_hit,0)) ) as from_cache | |
FROM pg_statio_all_tables --> change to pg_statio_USER_tables if you want to check only user tables (excluding postgres's own tables) | |
) a | |
WHERE (from_disk + from_cache) > 0 -- discard tables without hits | |
), | |
tables as | |
( | |
SELECT * | |
FROM ( | |
SELECT relname as table_name, | |
( (coalesce(heap_blks_read,0) + coalesce(idx_blks_read,0) + coalesce(toast_blks_read,0) + coalesce(tidx_blks_read,0)) ) as from_disk, | |
( (coalesce(heap_blks_hit,0) + coalesce(idx_blks_hit,0) + coalesce(toast_blks_hit,0) + coalesce(tidx_blks_hit,0)) ) as from_cache | |
FROM pg_statio_all_tables --> change to pg_statio_USER_tables if you want to check only user tables (excluding postgres's own tables) | |
) a | |
WHERE (from_disk + from_cache) > 0 -- discard tables without hits | |
) | |
SELECT table_name as "table name", | |
from_disk as "disk hits", | |
round((from_disk::numeric / (from_disk + from_cache)::numeric)*100.0,2) as "% disk hits", | |
round((from_cache::numeric / (from_disk + from_cache)::numeric)*100.0,2) as "% cache hits", | |
(from_disk + from_cache) as "total hits" | |
FROM (SELECT * FROM all_tables UNION ALL SELECT * FROM tables) a | |
ORDER BY (case when table_name = 'all' then 0 else 1 end), from_disk desc; | |
-- table size | |
SELECT | |
t.tablename, | |
indexname, | |
c.reltuples AS num_rows, | |
pg_size_pretty(pg_relation_size(quote_ident(t.tablename)::text)) AS table_size, | |
pg_size_pretty(pg_relation_size(quote_ident(indexrelname)::text)) AS index_size, | |
CASE WHEN indisunique THEN 'Y' | |
ELSE 'N' | |
END AS UNIQUE, | |
idx_scan AS number_of_scans, | |
idx_tup_read AS tuples_read, | |
idx_tup_fetch AS tuples_fetched | |
FROM pg_tables t | |
LEFT OUTER JOIN pg_class c ON t.tablename=c.relname | |
LEFT OUTER JOIN | |
( SELECT c.relname AS ctablename, ipg.relname AS indexname, x.indnatts AS number_of_columns, idx_scan, idx_tup_read, idx_tup_fetch, indexrelname, indisunique FROM pg_index x | |
JOIN pg_class c ON c.oid = x.indrelid | |
JOIN pg_class ipg ON ipg.oid = x.indexrelid | |
JOIN pg_stat_all_indexes psai ON x.indexrelid = psai.indexrelid AND psai.schemaname = 'public' ) | |
AS foo | |
ON t.tablename = foo.ctablename | |
WHERE t.schemaname='public' | |
ORDER BY 1,2; | |
-- see all replication slots | |
select * from pg_replication_slots; | |
-- drop replication slot | |
select pg_drop_replication_slot('Your_slotname_name'); | |
-- DB size | |
SELECT pg_size_pretty(pg_database_size('db_name')); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment