notes/db/sql/postgres/feature/internals/statistics/pg-stat-all-tables.txt
Ihar Hancharenka 110d3f694c m
2024-03-28 13:27:16 +03:00

84 строки
4.1 KiB
Plaintext

Если мы хотим, чтобы наша база данных работала эффективно и производительно, то за ней нужно следить, выявлять неоптимальные запросы и различные аномалии. В этом нам и поможет представление pg_stat_all_tables.
pg_stat_all_tables покажет нам статистику по всем таблицам базы данных (системным и пользовательским), покажет кол-во последовательных и индексных сканирований, операций по удалению, обновлению и вставки строк, а также кол-во "мертвых" строк и статус операций VACUUM и ANALYZE. Короче очень полезно представление 🤓
Давайте рассмотрим несколько полезных запросов к этому представлению.
✅ Смотрим количество операций последовательного сканирования пользовательских таблиц:
SELECT
schemaname,
relname,
seq_scan,
idx_scan,
seq_tup_read,
seq_tup_read / seq_scan as avg_seq_read
FROM
pg_stat_all_tables
WHERE
seq_scan > 0
AND
schemaname not in ('pg_catalog','information_schema','pg_toast')
ORDER BY
avg_seq_read DESC
LIMIT 10;
Этот запрос покажет топ 10 пользовательских таблиц, по которым было больше всего операций последовательного сканирования.
✅ Находим неиспользуемые или редко используемые таблицы:
SELECT
schemaname,
relname,
seq_scan,
idx_scan,
(COALESCE(seq_scan, 0) + COALESCE(idx_scan, 0)) as total_scans_performed
FROM
pg_stat_all_tables
WHERE
(COALESCE(seq_scan, 0) + COALESCE(idx_scan, 0)) < 10
AND schemaname not in ('pg_catalog', 'information_schema', 'pg_toast')
ORDER BY
5 DESC;
Запрос покажет таблицы, у которых операции последовательного и индексного сканирования не превышали кол-ва 10ть.
✅ Смотрим активность операций записи по пользовательским таблицам:
SELECT
st.schemaname,st.relname,
pg_size_pretty(pg_total_relation_size(st.relid)) as Total_Size,
st.seq_scan,
st.idx_scan,
st.n_tup_ins,
st.n_tup_upd,
st.n_tup_del
FROM pg_stat_all_tables st
WHERE st.schemaname not in ('pg_catalog','information_schema','pg_toast')
ORDER BY Total_Size DESC;
Запрос покажет кол-во операций последовательного и индексного сканирования по таблицам, а также кол-во операций вставки, удаления и обновления строк таблиц.
✅ Смотрим кол-во "живых" и "мертвых" строк пользовательских таблиц и проверяем статус VACUUM:
SELECT
schemaname,
relname,
n_live_tup,
n_dead_tup,
n_dead_tup * 100 / (case when n_live_tup > 0 then n_live_tup else 1 end) as dead_rows_percent,
last_autovacuum,
last_autoanalyze,
n_dead_tup,
relname
FROM
pg_stat_all_tables
WHERE
schemaname not in ('pg_catalog','information_schema','pg_toast')
ORDER BY
n_dead_tup DESC;
Запрос покажет кол-во "мертвых" строк на таблицах, а также время последнего прихода AUTOVACUUM в таблицу.
Как видите представление pg_stat_all_tables очень полезно для анализа статистики таблиц баз данных PostgreSQL. Конечно это не все возможные полезные запросы к этому представлению, в будущих постах будем публиковать и другие запросы, которые смогут на помочь в деле оптимизации производительности PostgreSQL 🧐