Блог об SQL
Разборы, уроки и советы — от основ до продвинутых техник
61 статей по теме PostgreSQL
Первичные ключи в PostgreSQL: SERIAL, BIGSERIAL, UUID или IDENTITY?
Первичные ключи в PostgreSQL: SERIAL vs BIGSERIAL vs GENERATED ALWAYS AS IDENTITY vs UUID. Производительность вставки, проблемы переполнения, когда UUID.
Динамический SQL в PostgreSQL: EXECUTE и строим запросы программно
Динамический SQL в PostgreSQL: EXECUTE в PL/pgSQL, FORMAT для безопасного построения запросов, защита от SQL-инъекций. Примеры с необязательными фильтрами.
Типы данных в PostgreSQL: как выбрать правильно
Типы данных в PostgreSQL: INTEGER vs BIGINT vs NUMERIC, VARCHAR vs TEXT, TIMESTAMP vs TIMESTAMPTZ, UUID, BOOLEAN, ENUM. Влияние выбора на производительность.
PIVOT в SQL: превращаем строки в столбцы
PIVOT в SQL: условная агрегация через CASE WHEN, расширение tablefunc и crosstab в PostgreSQL, динамический PIVOT. Примеры отчётов.
Продвинутые транзакции в PostgreSQL: SAVEPOINT и обработка ошибок
Продвинутые транзакции PostgreSQL: SAVEPOINT, ROLLBACK TO SAVEPOINT, вложенные транзакции, обработка deadlock на стороне приложения.
Оконные функции SQL: продвинутые техники и фреймы
Продвинутые оконные функции SQL: ROWS vs RANGE, фреймы PRECEDING/FOLLOWING, скользящие окна, EXCLUDE, FIRST_VALUE/LAST_VALUE. Примеры на PostgreSQL.
Time series анализ в PostgreSQL: временные ряды и тренды
Анализ временных рядов в PostgreSQL: скользящее среднее, заполнение пропусков, generate_series, lag/lead, сезонность, аномалии. Практические примеры.
Партиционирование таблиц в PostgreSQL: RANGE, LIST, HASH
Партиционирование PostgreSQL: RANGE по дате, LIST по категории, HASH по ID. Partition pruning, индексы, ATTACH/DETACH, автоматическое создание партиций.
Оптимизация JOIN в PostgreSQL: как ускорить объединения таблиц
Оптимизация JOIN в PostgreSQL: Hash Join vs Nested Loop vs Merge Join, когда JOIN медленный, индексы для JOIN, EXPLAIN ANALYZE, материализация CTE.
LATERAL JOIN в PostgreSQL: продвинутые запросы с зависимыми подзапросами
LATERAL JOIN в PostgreSQL: синтаксис, отличие от обычного JOIN, TOP-N на группу, unnest, generate_series. Когда и зачем использовать LATERAL.
Секционирование таблиц в PostgreSQL: PARTITION BY RANGE, LIST, HASH
Секционирование в PostgreSQL: PARTITION BY RANGE, LIST, HASH. Когда нужно секционирование, как создать и управлять секциями, прирост производительности.
Резервное копирование PostgreSQL: pg_dump и восстановление
Бэкап PostgreSQL через pg_dump, pg_dumpall, pg_basebackup. Форматы, автоматизация, восстановление из бэкапа, Point-in-Time Recovery. Практический гайд.
Multi-tenancy в PostgreSQL: паттерны изоляции данных
Три подхода к мультитенантности в PostgreSQL: отдельные БД, схемы на тенанта, общие таблицы с tenant_id. Сравнение, RLS, производительность.
Репликация PostgreSQL: streaming replication и read replicas
Настройка streaming replication в PostgreSQL: primary/standby, pg_basebackup, read replicas, синхронная репликация, мониторинг лага. Практический гайд.
PgBouncer: пул соединений для PostgreSQL
Настройка PgBouncer для PostgreSQL: режимы session/transaction/statement, pool_size, max_client_conn, мониторинг. Зачем нужен пул и как настроить.
Generated columns в PostgreSQL: вычисляемые столбцы
Generated (вычисляемые) столбцы в PostgreSQL: STORED vs виртуальные, синтаксис, ограничения, индексы. Когда использовать вместо триггеров и функциональных индексов.
Блокировки в PostgreSQL: FOR UPDATE, deadlock и как с ними работать
Блокировки в PostgreSQL: строчные и табличные блокировки, SELECT FOR UPDATE, FOR SHARE, обнаружение и предотвращение deadlock. Практические примеры.
Сравнение баз данных: PostgreSQL, MySQL, SQLite, MongoDB
Сравнение популярных баз данных: PostgreSQL vs MySQL, SQLite, MongoDB. Что выбрать для стартапа, аналитики, мобильного приложения или учёбы.
Временные паттерны в SQL: хранение истории изменений данных
Паттерны для хранения исторических данных в SQL: bi-temporal модели, valid time, transaction time, SCD Type 1/2/4, temporal таблицы в PostgreSQL.
CTE с DML в SQL: INSERT, UPDATE, DELETE внутри WITH
Как использовать CTE (WITH) с INSERT, UPDATE и DELETE в PostgreSQL: атомарные операции, перемещение строк, upsert с логированием, writable CTE паттерны.
Реляционные базы данных: как устроены таблицы и связи
Реляционные базы данных: таблицы, первичные и внешние ключи, нормализация, отношения один-ко-многим и многие-ко-многим. Основы для начинающих.
Настройка производительности PostgreSQL: ключевые параметры
Оптимизация postgresql.conf: shared_buffers, work_mem, checkpoint, autovacuum, max_connections. Диагностика узких мест, pg_stat_activity, pg_stat_bgwriter.
PostgreSQL для начинающих: первые шаги и основные команды
PostgreSQL для начинающих: установка, подключение, первые запросы, основные типы данных. Практическое введение в самую популярную СУБД с открытым кодом.
Materialized View в PostgreSQL: кэшируем тяжёлые запросы
Materialized View в PostgreSQL: создание, REFRESH MATERIALIZED VIEW, конкурентное обновление, отличие от обычного VIEW. Когда использовать и как избежать проблем.
PostGIS в PostgreSQL: работа с геоданными в SQL
Введение в PostGIS: геометрические типы, ST_Distance, ST_Within, ST_Intersects, поиск ближайших объектов, GiST-индексы для геоданных. Практические примеры.
SQL для дата-инженера: паттерны и техники 2026
SQL-паттерны для дата-инженеров: партиционирование запросов, оконные функции для ETL, обработка поздних данных, идемпотентные пайплайны, Data Vault.
Последовательности (SEQUENCE) в PostgreSQL: SERIAL, BIGSERIAL и nextval
Как работают последовательности в PostgreSQL: SERIAL vs BIGSERIAL vs GENERATED ALWAYS, nextval, setval, сброс, ямы в ID, применение в мультитаблицах.
JSONB в PostgreSQL: хранение и запросы к полуструктурированным данным
JSONB в PostgreSQL: операторы ->, ->>, @>, GIN-индексы, jsonb_array_elements, обновление полей. Когда использовать JSONB вместо отдельных таблиц.
Функции для работы с JSONB в PostgreSQL: полный справочник
Операторы и функции JSONB в PostgreSQL: извлечение значений, обновление, поиск, индексы GIN, jsonb_set, jsonb_each, jsonb_path_query. Примеры.
ROLLUP, CUBE и GROUPING SETS в SQL: многоуровневые итоги
Как строить многоуровневые отчёты в SQL с ROLLUP, CUBE и GROUPING SETS: subtotals, grand total, кросс-таблицы без CASE WHEN. Примеры для аналитики.
Популярные расширения PostgreSQL: pg_trgm, uuid-ossp, hstore и другие
Обзор ключевых расширений PostgreSQL: pg_trgm для нечёткого поиска, uuid-ossp, hstore, pg_stat_statements, pgcrypto, ltree, tablefunc. Когда и как использовать.
Полнотекстовый поиск в PostgreSQL: tsvector и tsquery
Полнотекстовый поиск в PostgreSQL: tsvector, tsquery, GIN-индексы, ранжирование результатов ts_rank. Примеры поиска на русском языке.
ETL-паттерны в SQL: загрузка, трансформация и обновление данных
Практические ETL-паттерны на SQL: upsert, SCD Type 2, инкрементальная загрузка, дедупликация, разбивка на батчи, аудитные поля. Для дата-инженеров.
Триггеры в PostgreSQL: создание, виды и практические примеры
Как создавать триггеры в PostgreSQL: BEFORE/AFTER, ROW/STATEMENT, триггерные функции на PL/pgSQL, аудит изменений, updated_at, мягкое удаление.
Фреймы оконных функций SQL: ROWS, RANGE и GROUPS
Полный разбор фреймов в оконных функциях SQL: ROWS vs RANGE vs GROUPS, UNBOUNDED PRECEDING, CURRENT ROW, EXCLUDE, примеры скользящих агрегатов.
CROSS JOIN и SELF JOIN в SQL: когда нужно декартово произведение
Как работают CROSS JOIN и SELF JOIN в SQL: декартово произведение, генерация комбинаций, иерархии сотрудников, поиск пар, практические примеры.
Медиана и процентили в SQL: PERCENTILE_CONT, PERCENTILE_DISC, NTILE
Как считать медиану, квартили и процентили в PostgreSQL: PERCENTILE_CONT, PERCENTILE_DISC, NTILE, MODE, оконные варианты, практические кейсы для аналитики.
Массивы в PostgreSQL: хранение, запросы и функции
Как работать с массивами в PostgreSQL: создание, ANY/ALL, unnest, array_agg, GIN-индекс, поиск по элементам, сравнение с JSONB и нормализацией.
LATERAL JOIN в PostgreSQL: когда подзапрос становится циклом
LATERAL JOIN в PostgreSQL: синтаксис, применение для топ-N в каждой группе, вызов функций для каждой строки, сравнение с обычным подзапросом.
Функциональные индексы в PostgreSQL: ускоряем запросы с функциями
Функциональные (expression) индексы в PostgreSQL: LOWER(), DATE_TRUNC(), JSON-поля, составные выражения. Когда помогают и как проверить через EXPLAIN.
UUID в PostgreSQL: когда использовать вместо SERIAL и как оптимизировать
UUID vs SERIAL в PostgreSQL: типы uuid, gen_random_uuid(), UUIDv7, производительность индексов, проблема фрагментации и когда UUID необходим.
Функции для работы с датами в SQL (PostgreSQL)
Работа с датами в SQL: DATE_TRUNC, EXTRACT, INTERVAL, AGE, NOW, TO_CHAR. Примеры для аналитики — метрики по периодам, разница дат, форматирование.
Схемы и роли в PostgreSQL: организация доступа к данным
Как работают схемы (namespaces) в PostgreSQL, создание ролей и пользователей, GRANT/REVOKE, разграничение доступа по схемам, Row Level Security.
Функции и хранимые процедуры в PostgreSQL: PL/pgSQL с нуля
Создание функций и процедур в PostgreSQL на PL/pgSQL: параметры, возвращаемые типы, условия, циклы, обработка ошибок. Когда использовать функции в SQL.
Deadlock в PostgreSQL: причины, диагностика и решение
Что такое deadlock в PostgreSQL, как он возникает, как обнаружить в логах и pg_locks, стратегии предотвращения и код с правильным порядком блокировок.
Функция нарастающего итога (Running Total) в SQL: объясняем за 5 минут
Как считать нарастающий итог в SQL: SUM OVER с ROWS/RANGE, кумулятивная сумма по дням, скользящее среднее, нарастающие количества пользователей.
LEAD и LAG в SQL: работа с соседними строками
Оконные функции LEAD и LAG в PostgreSQL: синтаксис, примеры — рост продаж, разница между событиями, цепочки платежей, поиск пропусков в данных.
EXPLAIN ANALYZE в PostgreSQL: как читать план запроса
Как использовать EXPLAIN и EXPLAIN ANALYZE в PostgreSQL: читаем план выполнения, находим Seq Scan, понимаем стоимость, ускоряем запросы.
VIEW в SQL: представления, материализованные вью и когда их использовать
Что такое VIEW в PostgreSQL, как создавать, обновлять, удалять. Отличие от материализованного VIEW, обновляемые вью, безопасность через RLS.
DML в SQL: INSERT, UPDATE, DELETE — полное руководство
Как вставлять, изменять и удалять данные в SQL: INSERT с подзапросами, UPDATE с JOIN, DELETE RETURNING, массовые операции и безопасные паттерны.
DDL в SQL: CREATE TABLE, ALTER TABLE, DROP — управление структурой БД
CREATE TABLE с ограничениями, ALTER TABLE для изменения схемы, DROP TABLE и безопасные миграции. PostgreSQL DDL с практическими примерами.
Рекурсивные CTE в PostgreSQL: иерархии, деревья и графы
Как использовать рекурсивные CTE (WITH RECURSIVE) в PostgreSQL: обход дерева организации, иерархические данные, граф маршрутов, поиск циклов.
Оптимизация SQL-запросов: практическое руководство
Как ускорить медленные SQL-запросы: индексы, переписывание запросов, EXPLAIN ANALYZE, типичные антипаттерны. Реальные примеры и советы для PostgreSQL.
Строковые функции в SQL: полный справочник с примерами
SUBSTRING, CONCAT, TRIM, UPPER, LOWER, REPLACE, LIKE, REGEXP, LENGTH и другие строковые функции в PostgreSQL. Примеры для очистки и трансформации данных.
PostgreSQL vs MySQL: что выбрать и чем они отличаются
Подробное сравнение PostgreSQL и MySQL: производительность, функциональность, типы данных, JSON, транзакции. Что лучше для аналитики, веб-приложений и продакшена.
Массовая загрузка данных в PostgreSQL: COPY и bulk INSERT
Как быстро загрузить миллионы строк в PostgreSQL: COPY FROM, multi-row INSERT, отключение индексов, настройки сессии для ETL.
Миграции базы данных: как менять схему без даунтайма
Zero-downtime миграции PostgreSQL: как добавить колонку, создать индекс CONCURRENTLY, переименовать таблицу без блокировок. Практические паттерны.
Антипаттерны индексов в PostgreSQL: когда индексы вредят
Когда индексы вредят: дублирующиеся индексы, низкая селективность, избыточное индексирование, index bloat. Как найти бесполезные индексы.
Мониторинг медленных запросов в PostgreSQL: pg_stat_statements
Как находить медленные запросы в PostgreSQL: pg_stat_statements, slow query log, топ-10 самых тяжёлых запросов, мониторинг production.
VACUUM и ANALYZE в PostgreSQL: как поддерживать производительность
VACUUM и ANALYZE в PostgreSQL: зачем нужны, autovacuum, bloat таблиц, как мониторить и когда запускать вручную. Практические советы.
PostgreSQL на собеседовании: специфика и задачи
Вопросы и задачи по PostgreSQL для технического интервью: специфичные функции, EXPLAIN, типы данных, JSON.