← Назад к вопросам

Что такое pg_catalog в PostgreSQL?

2.0 Middle🔥 81 комментариев
#Python Core#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое pg_catalog в PostgreSQL?

pg_catalog — это системная схема (schema) в PostgreSQL, которая содержит встроенные объекты базы данных: таблицы, функции, типы данных, операторы и другие метаданные. Это каталог системных объектов PostgreSQL.

Основное понимание

pg_catalog можно представить как "внутренний архив" БД, где хранится информация о структуре всей базы данных:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'pg_catalog' 
LIMIT 10;

Основные таблицы в pg_catalog

1. pg_class — информация о таблицах и индексах

SELECT relname, relpages, reltuples 
FROM pg_catalog.pg_class 
WHERE relkind = 'r';

Результат показывает названия таблиц, количество страниц и строк.

2. pg_attribute — информация о столбцах

SELECT attname, atttype::regtype 
FROM pg_catalog.pg_attribute 
WHERE attrelid = 'public.users'::regclass;

Получает список всех столбцов таблицы с их типами.

3. pg_type — определения типов данных

SELECT typname, typlen 
FROM pg_catalog.pg_type 
WHERE typnamespace = (
    SELECT oid FROM pg_namespace WHERE nspname = 'pg_catalog'
) LIMIT 15;

Показывает встроенные типы: int2, int4, int8, text и другие.

4. pg_proc — определения функций

SELECT proname, oid 
FROM pg_catalog.pg_proc 
WHERE pronamespace = (
    SELECT oid FROM pg_namespace WHERE nspname = 'public'
);

Список всех функций в схеме.

5. pg_index — информация об индексах

SELECT indexname, indexdef 
FROM pg_catalog.pg_indexes 
WHERE schemaname = 'public';

Все индексы и их определения.

Практические примеры использования

Пример 1: Список таблиц с размерами

SELECT 
    tablename,
    pg_size_pretty(pg_total_relation_size(
        'public.' || tablename
    )) as size
FROM pg_catalog.pg_tables
WHERE schemaname = 'public'
ORDER BY tablename;

Пример 2: Найти неиспользуемые индексы

SELECT 
    relname,
    indexrelname,
    idx_scan,
    pg_size_pretty(pg_relation_size(indexrelid)) as size
FROM pg_catalog.pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

Пример 3: Найти все внешние ключи

SELECT 
    constraint_name,
    table_name,
    column_name
FROM information_schema.table_constraints tc
JOIN information_schema.key_column_usage kcu 
    USING (constraint_name)
WHERE constraint_type = 'FOREIGN KEY'
    AND table_schema = 'public';

Разница между pg_catalog и information_schema

Параметрpg_cataloginformation_schema
СтандартPostgreSQL специфиченSQL стандарт
ДетализацияНизкоуровневаяВысокоуровневая
ПроизводительностьБыстрееМедленнее
ФункциональностьПолнаяБазовая

Просмотр pg_catalog в Python

import psycopg2

conn = psycopg2.connect("dbname=mydb user=postgres")
cursor = conn.cursor()

# Получить список всех таблиц
cursor.execute(
    "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public'"
)

tables = cursor.fetchall()
for table in tables:
    print(f"Таблица: {table[0]}")

# Получить столбцы конкретной таблицы
cursor.execute(
    "SELECT attname, atttype::regtype FROM pg_catalog.pg_attribute WHERE attrelid = %s::regclass",
    ('public.users',)
)

columns = cursor.fetchall()
for col_name, col_type in columns:
    print(f"  {col_name}: {col_type}")

cursor.close()
conn.close()

Почему нельзя редактировать pg_catalog

pg_catalog содержит критичные системные данные. Прямое редактирование может повредить БД:

-- НЕПРАВИЛЬНО (опасно)
UPDATE pg_catalog.pg_class SET relname = 'new_name' WHERE oid = 12345;

-- ПРАВИЛЬНО (безопасно)
ALTER TABLE old_table_name RENAME TO new_table_name;

Практическое применение

pg_catalog используется для:

  • Интроспекции БД — программно узнавать структуру БД
  • Администрирования — анализ и оптимизация
  • ORM и миграции — SQLAlchemy использует pg_catalog
  • Мониторинга — сбор статистики производительности
  • Автоматизации — генерация кода и документации

pg_catalog — мощный инструмент для администрирования PostgreSQL, но требует осторожности при работе.

Что такое pg_catalog в PostgreSQL? | PrepBro