Материалы / Технические статьи / Запрос для анализа партиций PostgreSQL
Статья

Запрос для анализа партиций PostgreSQL

SQL-запрос для обзора границ, размера, индексов, статистики обслуживания и табличных пространств партиций.

Этот запрос даёт обзор прямых партиций выбранной родительской таблицы. Укажите её имя и схему:

WITH parts AS (
SELECT
child.oid AS part_oid,
nmsp_child.nspname AS part_schema,
child.relname AS part_name,
pg_get_partkeydef(parent.oid) AS partitioning,
pg_get_expr(child.relpartbound, child.oid) AS part_bound
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relkind = 'p' -- гарантируем, что parent — партиционированная таблица
AND parent.relname = 'table_name' -- <<< Укажите имя родительской таблицы
AND nmsp_parent.nspname = 'schema_name' -- <<< Укажите схему родительской таблицы
)
SELECT
p.part_schema,
p.part_name,
p.partitioning,
p.part_bound,
pg_size_pretty(pg_total_relation_size(p.part_oid)) AS total_size,
pg_size_pretty(pg_table_size(p.part_oid)) AS table_size,
pg_size_pretty(pg_indexes_size(p.part_oid)) AS index_size,
(SELECT count(*) FROM pg_index i WHERE i.indrelid = p.part_oid) AS index_count,
COALESCE(NULLIF(st.n_live_tup, 0), c.reltuples)::bigint AS rows_estimate,
ROUND(100.0 * st.n_dead_tup / NULLIF(st.n_live_tup + st.n_dead_tup, 0), 2) AS dead_tuple_percent_estimate,
st.last_analyze,
st.last_autoanalyze,
st.last_vacuum,
st.last_autovacuum,
COALESCE(ts.spcname, 'pg_default') AS tablespace
FROM parts p
LEFT JOIN pg_class c ON c.oid = p.part_oid
LEFT JOIN pg_stat_all_tables st ON st.relid = p.part_oid
LEFT JOIN pg_tablespace ts ON c.reltablespace = ts.oid
ORDER BY p.part_schema, p.part_name;

n_live_tup и n_dead_tup — оценки накопительной статистики, поэтому процент мёртвых строк нельзя называть точной фрагментацией. Размеры включают разные составляющие (table_size — в том числе TOAST, total_size — также индексы), а порядок по имени корректен только при последовательной схеме именования.

Запрос показывает один уровень наследования. Для субпартиций используйте pg_partition_tree() или выполняйте обход рекурсивно. Перед эксплуатационным решением отдельно проверьте part_bound, индексы, ограничения и планы запросов.