PostgreSQL
PostgreSQL — свободная объектно-реляционная СУБД с сильной поддержкой SQL, транзакций и расширений вроде PostGIS.
Что такое PostgreSQL
PostgreSQL (произносится «постгрес-кью-эль», в обиходе — Postgres) — свободная объектно-реляционная СУБД. Развивается сообществом с середины 1990-х, распространяется под либеральной лицензией PostgreSQL License: использовать в коммерческих продуктах можно без ограничений, единого владельца у проекта нет.
Репутация Postgres строится на трёх вещах: строгое следование стандарту SQL, надёжность транзакций и расширяемость. Своими типами, функциями, языками и индексами базу дополняют без правки её кода — на этом построены PostGIS, pgvector, TimescaleDB.
Ключевые возможности
- MVCC — читатели не блокируют писателей, писатели не блокируют читателей.
- Типы данных:
jsonbс индексами по содержимому, массивы,numericпроизвольной точности, диапазоны,uuid, геометрия. - Индексы: B-tree, GIN, GiST, BRIN, hash — под разные задачи (подробнее).
- Оконные функции, CTE, рекурсивные запросы — аналитика без выгрузки данных наружу.
- Транзакционный DDL —
CREATE TABLEвнутри транзакции откатывается, что делает миграции безопасными. - Логическая и потоковая репликация из коробки.
Быстрый старт
sudo apt install postgresql
sudo -u postgres psql
CREATE DATABASE shop;
CREATE USER app WITH PASSWORD 'secret';
GRANT ALL PRIVILEGES ON DATABASE shop TO app;
psql -U app -d shop -h 127.0.0.1 # порт по умолчанию 5432
\l # список баз
\dt # таблицы
\d+ users # структура таблицы
\timing on # показывать время запросов
Доступ управляется файлом pg_hba.conf — правило host all all 0.0.0.0/0 md5 открывает базу всему интернету, чего делать не стоит: 5432 наружу не выставляют, ограничиваясь приватной сетью или SSH-туннелем.
Базовый тюнинг
Postgres из коробки настроен консервативно и не знает, сколько на сервере памяти:
# postgresql.conf, ориентиры для сервера с 16 ГБ RAM
shared_buffers = 4GB # ~25% RAM
effective_cache_size = 12GB # ~75% RAM, подсказка планировщику
work_mem = 32MB # на операцию сортировки, не на сессию
maintenance_work_mem = 512MB # VACUUM, CREATE INDEX
random_page_cost = 1.1 # для NVMe SSD, по умолчанию 4.0 (под HDD)
max_connections = 100
random_page_cost — частая находка: значение по умолчанию рассчитано на диски со шпинделем, и на NVMe планировщик из-за него недооценивает индексы и уходит в Seq Scan.
pgBouncer
pgBouncer — легковесный пулер соединений для PostgreSQL. Нужен потому, что Postgres на каждое соединение порождает отдельный процесс: тысяча соединений от приложения — тысяча процессов и гигабайты RAM. pgBouncer держит небольшой пул реальных соединений к базе и мультиплексирует в него клиентов.
# pgbouncer.ini
[databases]
shop = host=127.0.0.1 port=5432 dbname=shop
[pgbouncer]
listen_port = 6432
pool_mode = transaction # соединение возвращается в пул после COMMIT
max_client_conn = 1000 # клиентов принимаем
default_pool_size = 20 # реальных соединений к Postgres
pool_mode = transaction — обычный выбор для веб-приложений: он даёт лучшее переиспользование, но ломает то, что живёт дольше транзакции (SET, session-level advisory locks, подготовленные выражения без учёта пулера).
PostGIS
PostGIS — расширение, превращающее Postgres в полноценную геоинформационную базу: типы geometry/geography, пространственные индексы на GiST и сотни функций.
CREATE EXTENSION postgis;
-- 10 ближайших точек к координате
SELECT name, ST_Distance(geom, ST_MakePoint(37.62, 55.75)::geography) AS m
FROM places
ORDER BY geom <-> ST_MakePoint(37.62, 55.75)::geography
LIMIT 10;
Stack Builder
Stack Builder — вспомогательная утилита из установщика PostgreSQL для Windows (сборка EDB). После установки базы она предлагает докачать дополнительные компоненты: PostGIS, pgAgent, драйверы ODBC/JDBC, pgJDBC. Отдельной ценности не имеет и на Linux не используется — там всё ставится пакетным менеджером. Если Stack Builder запустился после установки и вам ничего из списка не нужно, окно можно просто закрыть.
Связанные термины
- СУБД — класс, к которому относится PostgreSQL
- SQL — язык запросов
- MySQL / MariaDB — основной конкурент среди открытых СУБД
- Репликация — потоковая и логическая репликация Postgres
- Индексы в БД — B-tree, GIN, GiST, BRIN
- Дамп базы данных —
pg_dumpи восстановление
Готовы запустить GPU-задачу?
Запустить GPU-сервер