Внешние данные, расширения и сертификация

Рейтинг: 71.7% · 16 голосов
Подробный курс по PostgreSQL: SQL по демобазе, типы данных и JSONB, индексы, транзакции и MVCC, VACUUM, EXPLAIN и планировщик, роли и привилегии, репликация, бэкап, настройка под нагрузку и под 1С. Актуально на 2026.
Ответить
Аватара пользователя
Egor_DBA
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Внешние данные, расширения и сертификация

Сообщение Egor_DBA »

Оглавление курса (47)
  1. Что такое PostgreSQL: история, философия, где применяется
  2. Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)
  3. Установка и первый запуск: Linux, Windows, Docker
  4. psql детально: метакоманды и работа в консоли
  5. Демобаза Авиаперевозки Postgres Pro: структура и развёртывание
  6. SELECT: проекция, фильтрация, сортировка
  7. Транзакции и ACID
  8. Уровни изоляции транзакций: Read Committed, Repeatable Read, Serializable
  9. Соединения таблиц (JOIN)
  10. Агрегация: GROUP BY, HAVING, GROUPING SETS
  11. Подзапросы и CTE (WITH), рекурсия
  12. Оконные функции
  13. Изменение данных: INSERT/UPDATE/DELETE, UPSERT, MERGE
  14. Числовые и булевы типы, NULL и трёхзначная логика
  15. Строки, текст, дата и время, таймзоны
  16. Массивы, диапазоны, enum, составные типы
  17. JSON и JSONB: операторы и индексация
  18. DDL: CREATE TABLE, схемы, ALTER
  19. Ограничения целостности
  20. Представления и материализованные представления
  21. Последовательности, IDENTITY, генерируемые столбцы
  22. Индексы: B-tree и когда индекс не используется
  23. Типы индексов: Hash, GiST, SP-GiST, GIN, BRIN
  24. Продвинутые индексы: частичные, по выражению, покрывающие
  25. Обслуживание индексов и таблиц: bloat, REINDEX, CONCURRENTLY
  26. Полнотекстовый поиск
  27. Роли и пользователи
  28. Привилегии: GRANT/REVOKE
  29. Row-Level Security и безопасность данных
  30. Подключение приложения: pg_hba.conf, SSL, пулы соединений
  31. Серверное программирование: функции и процедуры
  32. Триггеры и события
  33. Архитектура PostgreSQL: процессы и память
  34. MVCC: версии строк и видимость
  35. VACUUM, autovacuum, freeze и wraparound
  36. WAL, контрольные точки и долговечность
  37. Блокировки и взаимоблокировки
  38. Планировщик запросов
  39. EXPLAIN и EXPLAIN ANALYZE: чтение планов
  40. Конфигурация сервера: ключевые параметры
  41. Настройка под нагрузку и под 1С
  42. Параллельные запросы и партиционирование
  43. Резервное копирование и восстановление
  44. Репликация: потоковая и hot standby
  45. Логическая репликация и кластерные решения
  46. Внешние данные, расширения и сертификация (вы здесь)
  47. Разбор планов запросов на explain.tensor.ru: глубокое чтение EXPLAIN ANALYZE
Урок 45. Внешние данные, расширения и сертификация

В этом уроке мы выходим за пределы одной базы. Сначала разберём, как PostgreSQL читает и пишет данные из чужих источников через механизм FDW (Foreign Data Wrapper), не копируя их к себе. Потом посмотрим на расширения: что это вообще такое, как они доустанавливают возможности в живую базу одной командой, и какие из них стоит знать каждому. В конце поговорим про то, где учиться дальше и как держать руку на пульсе экосистемы postgresql в 2026 году, включая сертификацию Postgres Professional.

Изображение

Как это работает

FDW - это реализация стандарта SQL/MED (Management of External Data). Идея простая: вы описываете внешний источник как обычную таблицу, а драйвер-обёртка переводит запросы туда и обратно. Для вашего SELECT внешняя таблица выглядит почти как родная, но физически данные лежат в другой СУБД, в файле или за сетью. Это удобно для интеграции: не нужен ночной импорт, данные всегда свежие.

Цепочка объектов выстраивается так. Сначала ставится обёртка через CREATE EXTENSION postgres_fdw. Затем создаётся сервер (CREATE SERVER) - это описание, куда подключаться. Дальше идёт сопоставление пользователей (CREATE USER MAPPING) - кто и под каким логином ходит на удалённую сторону. И наконец сами внешние таблицы (CREATE FOREIGN TABLE) либо целый IMPORT FOREIGN SCHEMA, который вытянет описания таблиц автоматически.

Важная вещь про производительность - pushdown. Умный wrapper старается отправить на удалённую сторону как можно больше работы: фильтры WHERE, соединения, агрегаты, сортировку. Тогда по сети вернётся только результат, а не весь объём. Проверять, что именно ушло на удалённый сервер, надо через explain analyze - в плане видно строки Remote SQL.

Теперь расширения. Ядро postgresql намеренно держат компактным, а почти всё дополнительное оформляют как extension - это упакованный набор функций, типов данных, операторов и индексных методов, который подключается к конкретной базе командой CREATE EXTENSION. Расширение живёт внутри базы, а не всего кластера, поэтому ставить его надо в каждую нужную базу отдельно. Список доступных к установке смотрят в представлении pg_available_extensions, уже установленные - в pg_extension.

SQL и примеры

Поднимем связь с удалённым сервером, где лежит копия демобазы Авиаперевозки, и подтянем оттуда таблицу рейсов.

Код: Выделить всё

CREATE EXTENSION IF NOT EXISTS postgres_fdw;

CREATE SERVER air_remote
  FOREIGN DATA WRAPPER postgres_fdw
  OPTIONS (host '10.0.0.5', port '5432', dbname 'demo');

CREATE USER MAPPING FOR current_user
  SERVER air_remote
  OPTIONS (user 'reader', password 'secret');
Вместо ручного описания столбцов импортируем сразу нужные таблицы схемы bookings в локальную схему remote_air:

Код: Выделить всё

CREATE SCHEMA remote_air;

IMPORT FOREIGN SCHEMA bookings
  LIMIT TO (flights, airports, ticket_flights)
  FROM SERVER air_remote
  INTO remote_air;
Теперь обычный запрос. Считаем, сколько рейсов вылетает из каждого аэропорта, обращаясь к удалённым данным как к локальным:

Код: Выделить всё

SELECT a.airport_name, count(*) AS departures
FROM remote_air.flights f
JOIN remote_air.airports a ON a.airport_code = f.departure_airport
GROUP BY a.airport_name
ORDER BY departures DESC
LIMIT 10;
Проверим, что фильтр и соединение ушли на удалённую сторону, а не тащились по сети целиком:

Код: Выделить всё

EXPLAIN (ANALYZE, VERBOSE)
SELECT flight_no, scheduled_departure
FROM remote_air.flights
WHERE status = 'Departed';
В выводе ищите строку Remote SQL - там должна быть видна часть WHERE status = 'Departed'. Если её нет, фильтр выполняется уже локально и это медленнее.

Теперь расширения. Поставим несколько популярных и посмотрим, как они помогают:

Код: Выделить всё

CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
CREATE EXTENSION IF NOT EXISTS hstore;
pg_trgm даёт поиск по похожести и ускоряет LIKE '%...%' через триграммный GIN-индекс. Найдём аэропорты с опечаткой в названии города:

Код: Выделить всё

SELECT city, similarity(city, 'Moskva') AS sim
FROM bookings.airports
WHERE city % 'Moskva'
ORDER BY sim DESC;
pg_stat_statements собирает статистику по всем выполненным запросам - это первый инструмент, когда ищешь, что тормозит на проде. Топ запросов по суммарному времени:

Код: Выделить всё

SELECT query, calls, round(total_exec_time::numeric, 1) AS total_ms
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 5;
Это расширение требует прописать его в shared_preload_libraries и перезапустить сервер - просто CREATE EXTENSION без этого работать не будет. Из других известных: PostGIS добавляет геометрические типы данных и пространственные индексы для карт и геозапросов, а hstore хранит пары ключ-значение (для произвольных атрибутов, хотя сегодня под это чаще берут jsonb).

Частые грабли
  • Думают, что CREATE EXTENSION ставит расширение на весь кластер. Нет - только в текущую базу. Подключились к новой базе, повторили команду.
  • Файлы расширения должны лежать на диске сервера заранее (пакет вроде postgresql-15-postgis или contrib). CREATE EXTENSION не качает их из интернета, а лишь регистрирует уже установленное.
  • pg_stat_statements и подобные библиотеки молча не заработают без shared_preload_libraries и рестарта. Проверяйте SHOW shared_preload_libraries.
  • С postgres_fdw легко получить тормоза: если pushdown не сработал, через сеть едет вся таблица. Всегда смотрите explain analyze и строку Remote SQL.
  • use_remote_estimate по умолчанию выключен - планировщик гадает о размере удалённых таблиц. Для тяжёлых FDW-запросов включайте его на сервере или таблице.
  • Хранение пароля в USER MAPPING открытым текстом - риск. Лучше отдельная роль только на чтение и ограниченные права на удалённой стороне.
  • Версию расширения после обновления кластера надо поднимать вручную: ALTER EXTENSION ... UPDATE, иначе остаётесь на старом наборе функций.
Мини-лаба
  • Шаг 1. В psql выполните CREATE EXTENSION pg_trgm; и проверьте установку запросом к pg_extension.
  • Шаг 2. Создайте GIN-индекс на bookings.airports по столбцу city с классом операторов gin_trgm_ops.
  • Шаг 3. Сделайте поиск похожих городов через оператор % и оцените план через EXPLAIN - используется ли индекс.
  • Шаг 4. Установите pg_stat_statements (добавьте в shared_preload_libraries, перезапустите сервер, затем CREATE EXTENSION).
  • Шаг 5. Прогоните несколько SELECT по bookings и найдите их в pg_stat_statements, отсортировав по mean_exec_time.
  • Шаг 6. Посмотрите pg_available_extensions и выпишите три незнакомых расширения, прочитав их короткое описание в столбце comment.
  • Шаг 7. (по желанию) Поднимите второй кластер локально, настройте postgres_fdw на него и сравните планы с use_remote_estimate on и off.
Контрольные вопросы
  • Чем стандарт SQL/MED и FDW отличаются от обычного импорта данных, и в чём плюс работы с внешними таблицами?
  • Какие четыре объекта нужно создать, чтобы прочитать таблицу через postgres_fdw, и за что отвечает каждый?
  • Что такое pushdown и как по плану explain analyze понять, что фильтр ушёл на удалённый сервер?
  • Почему CREATE EXTENSION надо повторять в каждой базе, и где смотреть список доступных и установленных расширений?
  • Почему pg_stat_statements не заработает после одного CREATE EXTENSION, и что для него нужно настроить?
  • Где сегодня учиться PostgreSQL дальше и какие шаги к сертификации Postgres Professional вы бы наметили?
👍5 ❤️4 🔥1 😄 🤔
Аватара пользователя
hardraccoon
Сообщения: 1
Зарегистрирован: 14 май 2026, 09:40

Re: Внешние данные, расширения и сертификация

Сообщение hardraccoon »

Подтверждаю про shared_preload_libraries - забыл рестартнуть и полчаса тупил, почему pg_stat_statements пустой. Добавьте в урок жирным, что без перезапуска никак.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
vanessa
Сообщения: 1
Зарегистрирован: 14 май 2026, 22:33

Re: Внешние данные, расширения и сертификация

Сообщение vanessa »

А обязательно поднимать второй кластер для лабы по fdw? У меня одна машина, можно ли два инстанса на разных портах локально и смотреть pushdown между ними?
👍 ❤️1 🔥 😄 🤔1
Ответить
← Предыдущая глава
Логическая репликация и кластерные решения
Следующая глава →
Разбор планов запросов на explain.tensor.ru: глубокое чтение EXPLAIN ANALYZE

Все главы курса «PostgreSQL: от первого запроса до продакшена»

Поделиться темой: ✈ Telegram VK

Вернуться в «PostgreSQL: от первого запроса до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость