PostgreSQL

Материал из llmdocs — справочник разработчика
Портал: Базы данных
PostgreSQL
Типобъектно-реляционная СУБД
РазработчикPostgreSQL Global Development Group
Первый выпуск1996 (как PostgreSQL; проект POSTGRES — с 1986)
Язык реализацииC
ЛицензияPostgreSQL License (разрешительная, в духе BSD/MIT)
Порт по умолчанию5432
Цикл выпусковмажорная версия ежегодно, поддержка 5 лет
Сайтpostgresql.org

PostgreSQL (произносится «пост-грес-кью-эль», в обиходе — Postgres) — свободная объектно-реляционная система управления базами данных. Она известна строгим следованием стандарту SQL, надёжными транзакциями, богатым набором типов данных и механизмом расширений, который позволяет добавлять новые типы, функции, индексы и даже языки программирования. По опросам разработчиков Stack Overflow PostgreSQL с 2023 года — самая используемая база данных.[8]

История

Проект начался в 1986 году в Калифорнийском университете в Беркли под руководством Майкла Стоунбрейкера как преемник СУБД Ingres — отсюда название POSTGRES («после Ingres»). В нём впервые появились пользовательские типы данных и правила. В 1994 году Эндрю Ю и Джолли Чен заменили собственный язык запросов PostQUEL на SQL и выпустили Postgres95; в 1996 году проект переименовали в PostgreSQL и передали сообществу.[1]

Сегодня PostgreSQL развивает глобальная группа разработчиков, не принадлежащая какой-либо компании. Мажорная версия выходит раз в год (обычно осенью), каждая поддерживается пять лет; минорные выпуски с исправлениями выходят ежеквартально.[2] Лицензия PostgreSQL License разрешает любое, в том числе коммерческое, использование и модификацию, поэтому на его основе построены многие продукты и облачные сервисы.[3]

Архитектура

  • Процесс на соединение. Главный процесс (postmaster) порождает отдельный серверный процесс для каждого клиента. Соединения дороги, поэтому перед базой часто ставят пулер вроде PgBouncer.
  • MVCC. Изменение строки создаёт её новую версию, а старая остаётся видимой для транзакций, начавшихся раньше. Читатели не блокируют писателей и наоборот.[4] Устаревшие версии убирает фоновый процесс autovacuum (см. MVCC).
  • WAL. Каждое изменение сначала записывается в журнал упреждающей записи (write-ahead log), и лишь потом — в файлы данных. Журнал обеспечивает восстановление после сбоя, резервное копирование на момент времени (PITR) и репликацию.[5]
  • Оптимизатор запросов на основе стоимости собирает статистику по таблицам и выбирает план; посмотреть его можно командой EXPLAIN.

Возможности

  • Полноценные транзакции, включая транзакционный DDL: CREATE TABLE или ALTER TABLE можно откатить. Все уровни изоляции, включая настоящий SERIALIZABLE.
  • Типы данных: массивы, jsonb (двоичный JSON с индексами), диапазоны, uuid, сетевые адреса, геометрия, перечисления, составные типы.
  • Индексы нескольких видов: B-tree, Hash, GiST, SP-GiST, GIN, BRIN; частичные, по выражениям и покрывающие индексы.[6]
  • Оконные функции, рекурсивные CTE, MERGE, полнотекстовый поиск, секционирование таблиц.
  • Хранимые процедуры на PL/pgSQL, а также на Python, Perl и других языках.
  • Физическая (потоковая) и логическая репликация.

Расширения

Расширение подключается одной командой CREATE EXTENSION и может добавлять типы, операторы и методы индексирования. Самые известные:

Расширение Назначение
PostGIS геопространственные данные и запросы
pgvector хранение эмбеддингов и векторный поиск
pg_stat_statements статистика выполнения запросов
TimescaleDB временные ряды
Citus распределение таблиц по узлам (шардирование)
pg_trgm поиск по сходству строк (триграммы)

Благодаря расширениям PostgreSQL часто заменяет сразу несколько специализированных систем: документную базу, геоинформационную систему и векторное хранилище для RAG.

Практика

Быстрее всего запустить PostgreSQL в Docker:

docker run -d --name pg -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres:18
psql -h localhost -U postgres
-- в psql
\l                 -- список баз
\dt                -- таблицы текущей схемы
\d+ orders         -- структура таблицы
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 42;

Полезные практики: включить pg_stat_statements для поиска медленных запросов, следить за работой autovacuum на часто обновляемых таблицах, делать резервные копии через pg_dump или непрерывное архивирование WAL, а изменения схемы проводить миграциями. Список изменений по версиям публикуется в примечаниях к выпускам.[7]

Сравнение

По сравнению с MySQL PostgreSQL исторически строже к типам и стандарту и богаче возможностями, MySQL — проще в репликации и распространён в веб-хостинге. SQLite — встраиваемая база без сервера, удобная для локальных приложений и тестов. Для аналитики над миллиардами строк используют колоночные СУБД вроде ClickHouse.

См. также

Источники

  1. PostgreSQL Documentation — A Brief History of PostgreSQL
  2. PostgreSQL — Versioning Policy
  3. PostgreSQL — License
  4. PostgreSQL Documentation — Concurrency Control (MVCC)
  5. PostgreSQL Documentation — Write-Ahead Logging
  6. PostgreSQL Documentation — Index Types
  7. PostgreSQL Documentation — Release Notes
  8. Stack Overflow Developer Survey — Databases