PostgreSQL

Основы PostgreSQL

4 вопросов

PostgreSQL — объектно-реляционная СУБД с полным SQL стандартом, расширениями (JSONB, GIS), MVCC. MySQL — упрощенная, быстрее на простых операциях.

Multi-Version Concurrency Control. Каждая транзакция видит согласованный снимок данных. Устаревшие версии строк удаляются VACUUM.

DELETE — логируется, вызывает триггеры, можно WHERE, rollback'ится. TRUNCATE — мгновенный, без WHERE/триггеров, AUTO_INCREMENT сбрасывается.

Write-Ahead Logging — все изменения сначала пишутся в лог перед применением к данным. Гарантия восстановления после сбоя.

Индексы и оптимизация

4 вопросов

B-tree (по умолчанию), Hash, GiST, GIN (JSONB, полнотекстовый поиск), BRIN (для больших отсортированных таблиц), Partial (условие WHERE).

GIN — для точного поиска в массивах/JSONB (быстрый lookup). GiST — для пространственных данных и неполного соответствия (GIS, полнотекстовый).

CREATE INDEX idx_gin ON documents USING GIN (data);

Показывает план выполнения запроса с реальными метриками времени. seq_scan — плохой знак для больших таблиц.

EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM users WHERE age > 25;

Удаляет dead tuples (мёртвые строки от UPDATE/DELETE). AUTOVACUUM автоматически запускается для всех таблиц.

JSON/JSONB

3 вопросов

JSON — текст как есть. JSONB — бинарный, с индексацией, валидацией, быстрее для чтения/поиска.

data jsonb NOT NULL

-> (get field как объект), ->> (как текст), @> (contains), ? (has key), #>> (path как текст).

SELECT * FROM products WHERE data @> '{"category": "electronics"}';

CREATE INDEX ON table USING GIN (jsonb_column). Поддерживает @>, ?| (любой ключ), ?& (все ключи).

Производительность

4 вопросов

Много запросов вместо одного. Решение: JOIN'ы, LATERAL, оконные функции, materialized CTE.

INNER — пересечение. LEFT — все слева + NULL справа. LATERAL — коррелированный подзапрос (работает как JOIN с функцией).

WITH my_cte AS MATERIALIZED (SELECT ...) — вычисляется один раз, кэшируется. Обычный CTE пересчитывается для каждого использования.

work_mem — память для сортировки/хэш-джойнов на операцию. maintenance_work_mem — для VACUUM/INDEX. Перебор = OOM.

Транзакции и блокировки

3 вопросов

Read Uncommitted (грязное чтение), Read Committed (по умолчанию), Repeatable Read, Serializable (блокирует конфликтующие транзакции).

Deadlock — взаимная блокировка. Livelock — процессы работают, но не продвигаются (постоянно уступают друг другу).

pg_stat_activity (state='active', query_start), pg_locks, pg_blocking_pids().

SELECT * FROM pg_stat_activity WHERE state = 'active' AND now() - query_start > '5 minutes';

Расширения и продвинутые возможности

4 вопросов

Расширение для геоданных. Поддерживает точки, полигоны, расстояния, ST_*. Индексы GIST.

Расширение для временных рядов. Hypertables автоматически партиционируются по времени + сжатие.

tsvector + tsquery. to_tsvector('russian', text) @@ plainto_tsquery('russian', 'поиск'). Индекс GIN.

Стрим изменений между БД (не физический дамп). Поддерживает разные версии PG, фильтрацию таблиц.

Администрирование

3 вопросов

Primary-standby с streaming replication. wal_level=replica, max_wal_senders, hot_standby=on.

pg_dump — логический дамп (SQL). pg_basebackup — физический (файлы БД для репликации).

pg_stat_activity, pg_stat_bgwriter, pg_stat_database (tup_fetched/returned), checkpoints, WAL size, cache hit ratio (>99%).

Продвинутый SQL

2 вопросов

ROW_NUMBER(), RANK(), LAG(), LEAD(), агрегаты OVER(). Группировка без GROUP BY.

ROW_NUMBER() OVER (PARTITION BY category ORDER BY price) as rn

UNION ALL — просто склейка. UNION — склейка + DISTINCT (медленнее).

Навигация