2.2Kпросмотров
76.9%от подписчиков
21 ноября 2025 г.
Score: 2.5K
🔬 Системный каталог PostgreSQL (ч. 3). Всем привет! Продолжаем разбираться с системным каталогом PostgreSQL. Это будет заключительная заметка из этой серии. Фактически, те метакоманды psql, которые мы изучали в первой заметке из этой серии соответствуют конкретным таблицам системного каталога. Вот их примерное соответствие: \d (таблицы и объекты) - pg_class \di (индексы) - pg_class, pg_index \dx (установленные расширения) - pg_extension \dp (таблицы и привилегии) - pg_class, pg_roles, pg_attribute \l (базы данных) - pg_database \df (доступные функции) - pg_proc Давайте рассмотрим эти таблицы подробнее и посмотрим как их можно использовать. pg_stats Таблица pg_stats собирает всю статистику о ваших столбцах - такие вещи как кардинальность - много ли элементов в этом столбце или мало? Postgres использует много информации из pg_stats для принятия решений планировщиком запросов. В некоторых случаях предоставление pg_stats дополнительной информации может ускорить ваши запросы. Этот запрос покажет информацию по столбцам конкретной таблицы: SELECT FROM pg_stats
WHERE tablename = 'имя_таблицы'
AND attname = 'имя_столбца'; pg_class pg_class содержит строку для каждой таблицы, индекса, последовательности, представления, материализованного представления и других объектов в базе данных. SELECT c.relname, pg_get_userbyid(c.relowner) AS owner
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' AND c.relkind = 'r'
ORDER BY c.relname; pg_type Эта таблица хранит все существующие типы данных. В Postgres каждая таблица имеет связанный составной тип, который определяет структуру ее строк. Так что если вы сделаете SELECT , вы увидите здесь все имена таблиц и все типы данных. Если немного отфильтровать, вы можете увидеть все свои пользовательские типы данных, домены и перечисления. Этот запрос покажет пользовательские типы данных в Postgres: SELECT t.typname AS type_name, n.nspname AS schema_name, t.typtype AS type_class
FROM pg_type AS t
JOIN pg_namespace AS n ON t.typnamespace = n.oid
LEFT JOIN pg_class c ON typrelid = c.oid
WHERE t.typtype IN ('e', 'd', 'c') AND n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast') AND (t.typtype <> 'c' OR c.relkind = 'c')
ORDER BY schema_name, type_name; pg_proc Это каталог всех функций и хранимых процедур, которые может использовать Postgres. Создали функцию на прошлой неделе, но не можете найти сейчас? Просто просмотрите их все. Этот запрос находит все функции, триггеры и хранимые процедуры; SELECT proname AS function_name, proargnames AS argument_names, pg_catalog.format_type(prorettype, NULL) AS return_type
FROM pg_proc
ORDER BY proname; pg_attribute Эта таблица хранит информацию о столбцах таблиц. pg_attribute покажет одна строку для каждого столбца в каждой таблице. Запрос столбцов и типов данных для любой таблицы: SELECT a.attname AS column_name, pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = 'orders'::regclass AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum; Схема pg_catalog pg_catalog- это схема, содержащая системные таблицы. Иногда навигация по этим таблицам и представлениям может быть запутанной и требовать просмотра смеси документации и исходного кода. Если вы хотите исследовать, как каталог связан, вы можете подключиться к своей базе данных с аргументом -E для psql (или выполнить \set ECHO_HIDDEN on, если вы уже подключены). Postgres будет показывать SQL-команду, которая выполняется для каждой метакоманды psql. Очень полезно для образовательных целей и понимания внутреннего устройства PostgreSQL. На этом все! До связи! #pgbase #queries