Запрос для анализа партиций PostgreSQL
SQL-запрос для обзора границ, размера, индексов, статистики обслуживания и табличных пространств партиций.
PostgreSQLSQLПартиционированиеОбслуживаниеЭтот запрос даёт обзор прямых партиций выбранной родительской таблицы. Укажите её имя и схему:
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 tablespaceFROM 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.oidORDER BY p.part_schema, p.part_name;n_live_tup и n_dead_tup — оценки накопительной статистики, поэтому процент мёртвых строк нельзя называть точной фрагментацией. Размеры включают разные составляющие (table_size — в том числе TOAST, total_size — также индексы), а порядок по имени корректен только при последовательной схеме именования.
Запрос показывает один уровень наследования. Для субпартиций используйте pg_partition_tree() или выполняйте обход рекурсивно. Перед эксплуатационным решением отдельно проверьте part_bound, индексы, ограничения и планы запросов.