Что такое pg_catalog в PostgreSQL?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое 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_catalog | information_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, но требует осторожности при работе.