Основы 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 (медленнее).