Внутренняя архитектура PostgreSQL
👉 @SQLPortal
1. Архитектура на основе процессов
PostgreSQL использует архитектуру «один процесс на соединение», то есть для каждого клиента создаётся отдельный процесс операционной системы.
2. Журнал предзаписи
PostgreSQL применяет WAL для обеспечения надёжности данных, согласованности, восстановления после сбоев и репликации
3. Многоверсионность и управление параллелизмом
Благодаря MVCC PostgreSQL позволяет выполнять параллельные транзакции без необходимости жёсткой блокировки данных
4. Конвейер выполнения запросов
Запросы в PostgreSQL проходят через чёткую последовательность этапов: разбор, планирование, исполнение и возврат результатов
5. Система индексации
PostgreSQL поддерживает множество типов индексов (B-Tree, GIN, GiST, BRIN и др.) для оптимизации запросов под разные типы данных
6. Партиционирование таблиц
PostgreSQL позволяет разбивать большие таблицы на более мелкие части (партиции) по диапазону значений, списку или хешу, что упрощает управление и ускоряет обработку.
7. Логическая декодировка
Позволяет транслировать изменения из WAL в логическом формате, что полезно для репликации и систем отслеживания изменений (CDC).
8. Расширения
PostgreSQL построен как модульная система и поддерживает расширения, которые позволяют добавлять новые функции и возможности.
9. Сбор статистики
Механизм сбора статистики PostgreSQL отслеживает активность в реальном времени, что помогает анализировать и оптимизировать производительность базы данных
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Использование привязанных переменных — ключ к быстрой работе приложений
Пишите SQL вот так:
Каждое новое значение VAR создаёт новый запрос ⇒ много разборов ⇒ медленно
Используйте привязку вот так:
Один и тот же запрос для любого значения ⇒ один разбор ⇒ быстро
👉 @SQLPortal
Пишите SQL вот так:
'SELECT ... WHERE col = ' || var
Каждое новое значение VAR создаёт новый запрос ⇒ много разборов ⇒ медленно
Используйте привязку вот так:
'SELECT ... WHERE col = :bind'
Один и тот же запрос для любого значения ⇒ один разбор ⇒ быстро
Please open Telegram to view this post
VIEW IN TELEGRAM
Что из следующего присутствует в каждой оконной функции?
Anonymous Quiz
2%
DENSE_RANK
16%
Partition
60%
OVER
6%
RANK
16%
Всё перечисленное
❤1
Знаешь, что Postgres можно тюнить по одной таблице?
ALTER TABLE SET позволяет задавать отдельные параметры тюнинга, такие как fill factor, vacuum и параллельные воркеры, для конкретных нагрузок. Это более гранулярный и точный подход и может быть лучше, чем настройка на уровне всей базы данных.
Например, таблица с частыми вставками и обновлениями может использовать более агрессивное вакуумирование и уменьшенный фактор заполнения, чтобы снизить фрагментацию и ускорить записи. При этом аналитическая таблица с редкими изменениями может получить больше параллельных воркеров для ускорения чтения без влияния на остальную систему
👉 @SQLPortal
ALTER TABLE SET позволяет задавать отдельные параметры тюнинга, такие как fill factor, vacuum и параллельные воркеры, для конкретных нагрузок. Это более гранулярный и точный подход и может быть лучше, чем настройка на уровне всей базы данных.
Например, таблица с частыми вставками и обновлениями может использовать более агрессивное вакуумирование и уменьшенный фактор заполнения, чтобы снизить фрагментацию и ускорить записи. При этом аналитическая таблица с редкими изменениями может получить больше параллельных воркеров для ускорения чтения без влияния на остальную систему
ALTER TABLE orders
SET (
fillfactor = 80,
autovacuum_vacuum_scale_factor = 0.1,
autovacuum_analyze_scale_factor = 0.05,
parallel_workers = 4
);
ALTER TABLE events_log
SET (
fillfactor = 70,
autovacuum_enabled = true,
parallel_workers = 2
);
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Media is too big
VIEW IN TELEGRAM
Многие ИИ-воркфлоу у разработчиков выглядят так:
upsert строки → вызов API → обработка через ИИ → обновление строки
А что если запускать LLM прямо в базе данных, с доступом ко всем примитивам и аутентификацией?
Чуваки открыли исходный код Postgres LLM.
- полностью асинхронно, не блокирует транзакции
- работает с любой моделью
можно быстро стартовать в supabase, не выходя из дашборда или просто передать это агенту
👉 @SQLPortal
upsert строки → вызов API → обработка через ИИ → обновление строки
А что если запускать LLM прямо в базе данных, с доступом ко всем примитивам и аутентификацией?
Чуваки открыли исходный код Postgres LLM.
- полностью асинхронно, не блокирует транзакции
- работает с любой моделью
можно быстро стартовать в supabase, не выходя из дашборда или просто передать это агенту
Please open Telegram to view this post
VIEW IN TELEGRAM
Пилообразные всплески ввода-вывода в Postgres часто связаны с агрессивными настройками контрольных точек.
Чтобы стабилизировать задержки, стоит увеличить параметр
Также имеет смысл выставить
Пример настройки в
Если настраивать через SQL:
Проверка текущих значений:
👉 @SQLPortal
Чтобы стабилизировать задержки, стоит увеличить параметр
checkpoint_timeout.Также имеет смысл выставить
checkpoint_completion_target = 0.9, чтобы распределить нагрузку ввода-вывода более равномерно во времени.Пример настройки в
postgresql.conf:checkpoint_timeout = 15min
checkpoint_completion_target = 0.9
Если настраивать через SQL:
ALTER SYSTEM SET checkpoint_timeout = '15min';
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
SELECT pg_reload_conf();
Проверка текущих значений:
SHOW checkpoint_timeout;
SHOW checkpoint_completion_target;
Please open Telegram to view this post
VIEW IN TELEGRAM
Познакомьтесь с Postgresus — open-source и self-hosted решением для автоматизации бэкапов PostgreSQL.
Инструмент закрывает типичный набор задач, которые обычно размазываются по cron-скриптам и ручной поддержке.
Возможности:
- простое планирование резервного копирования;
- выгрузка в облачные хранилища (S3, R2, Google Drive);
- уведомления в Slack и Telegram.
Работа с бэкапами PostgreSQL часто превращается в набор разрозненных скриптов, где нужно отдельно держать расписание, ретраи, доставку в хранилища и алерты. Postgresus собирает это в единый воркфлоу с самохостингом и автоматизацией.
Подходит для DevOps-сценариев, где нужно централизовать резервное копирование без внешних SaaS-зависимостей.
👉 @SQLPortal
Инструмент закрывает типичный набор задач, которые обычно размазываются по cron-скриптам и ручной поддержке.
Возможности:
- простое планирование резервного копирования;
- выгрузка в облачные хранилища (S3, R2, Google Drive);
- уведомления в Slack и Telegram.
Работа с бэкапами PostgreSQL часто превращается в набор разрозненных скриптов, где нужно отдельно держать расписание, ретраи, доставку в хранилища и алерты. Postgresus собирает это в единый воркфлоу с самохостингом и автоматизацией.
Подходит для DevOps-сценариев, где нужно централизовать резервное копирование без внешних SaaS-зависимостей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Мониторинг реплик Postgres
Смотри
Пример SQL-запросов для мониторинга.
Основная нода — состояние репликации
Основная нода — минимальная проверка подключённых реплик
Резервная нода — время последнего применённого коммита
Резервная нода — оценка отставания по времени
👉 @SQLPortal
Смотри
pg_stat_replication на primary-ноде для отслеживания лага в реальном времени и состояния синхронизации. На standby используй pg_last_xact_replay_timestamp(), чтобы точно увидеть, когда был применён последний коммит.Пример SQL-запросов для мониторинга.
Основная нода — состояние репликации
SELECT
application_name,
client_addr,
state,
sync_state,
write_lag,
flush_lag,
replay_lag
FROM pg_stat_replication;
Основная нода — минимальная проверка подключённых реплик
SELECT *
FROM pg_stat_replication;
Резервная нода — время последнего применённого коммита
SELECT pg_last_xact_replay_timestamp();
Резервная нода — оценка отставания по времени
SELECT now() - pg_last_xact_replay_timestamp() AS replay_delay;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Foreign Data Wrapper (FDW) в Postgres позволяют работать с удалёнными БД как с локальными таблицами. Поддерживаются FDW для других Postgres-баз, MongoDB, MySQL, ClickHouse и даже OGR spatial-файлов. Один запрос, несколько источников — без ETL.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
В PostgreSQL есть LEAST и GREATEST для сравнения значений по колонкам — это не то же самое, что агрегационные MIN и MAX.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🌚2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🔥2
Компания Zomato обрабатывает более 2 млн заказов в день.
450 млн сообщений в Kafka в минуту.
20 млрд событий обрабатывается в неделю.
Петабайты данных выполняются через запросы ежедневно.
Когда-нибудь задумывался, что происходит с данными твоего заказа ПОСЛЕ нажатия «Оформить заказ»?
Вот как реально выглядит data-пайплайн Zomato:
𝟭. 𝗧𝘆 𝗻𝗮𝘇𝗵𝗮𝗹 «𝗢𝗳𝗼𝗿𝗺𝗶𝘁𝘆 𝘇𝗮𝗸𝗮𝘇»
⤷ Заказ, оплата и геолокация попадают в Aurora MySQL + DynamoDB.
𝟮. 𝗦𝗼𝗯𝘆𝘁𝗶𝘆𝗮 𝗶𝗱𝘂𝘁 𝘃 𝗞𝗮𝗳𝗸𝗮
⤷ 450M+ сообщений в минуту.
⤷ Отсюда стартуют все downstream-пайплайны.
𝟯. 𝟰 𝗽𝗮𝗽𝗮𝗶𝗻𝗹𝗮𝗶𝗻𝗮 𝘇𝗮𝗽𝘂𝘀𝗸𝗮𝘆𝘂𝘁𝘀𝘆𝗮 (𝗻𝗲 𝟭, 𝗮 𝗰𝗵𝗲𝘁𝘆𝗿𝗲)
MySQL → Sqoop → S3 (пакетный ETL)
MySQL → Debezium CDC → Kafka → Flink → Iceberg (стриминг)
DynamoDB Streams → Spark → S3 (serverless-данные)
App Events → Kafka → Flink → Druid (реалтайм-дашборды)
𝟰. 𝗩𝘀𝗲 𝗽𝗮𝗱𝗮𝗲𝘁 𝘃 𝗦𝟯
⤷ Формат ORC. Таблицы Iceberg.
⤷ Вся система сходится в data lake.
𝟱. 𝗧𝗿𝗶𝗻𝗼 𝗼𝗯𝗿𝗮𝗯𝗮𝘁𝘆𝘃𝗮𝗲𝘁 𝗱𝗮𝘁𝗮𝗹𝗮𝗸𝗲
⤷ 250K+ запросов в неделю. 2 петабайта сканирования.
⤷ 3 типа кластеров: ad-hoc, ETL (через Airflow), отчётность.
⤷ JOIN’ы между MySQL, Druid, Pinot и MongoDB.
𝟲. 𝗗𝗿𝘂𝗶𝗱 𝗱𝗮𝗲𝘁 𝗿𝗲𝗮𝗹𝘁𝗮𝗶𝗺
⤷ 20 млрд событий в неделю. 8 млн запросов в неделю.
⤷ Время ответа — миллисекунды.
𝟳. 𝗞𝗼𝗺𝗮𝗻𝗱𝘆 𝘀𝗺𝗼𝘁𝗿𝘆𝗮𝘁 𝗱𝗮𝘀𝗵𝗯𝗼𝗮𝗿𝗱𝘆
⤷ Superset + Redash + Jupyter
𝗙𝘂𝗹𝗹 𝘀𝘁𝗲𝗸:
- Kafka (450M сообщений/мин)
- Flink, Spark, Sqoop на EMR
- Trino (batch) + Druid (real-time)
- S3 + Iceberg + ORC
- Debezium CDC
- Airflow
- Superset, Redash, Jupyter
В следующий раз, когда закажешь бирьяни в пятницу в 21:00…
👉 @SQLPortal
450 млн сообщений в Kafka в минуту.
20 млрд событий обрабатывается в неделю.
Петабайты данных выполняются через запросы ежедневно.
Когда-нибудь задумывался, что происходит с данными твоего заказа ПОСЛЕ нажатия «Оформить заказ»?
Вот как реально выглядит data-пайплайн Zomato:
𝟭. 𝗧𝘆 𝗻𝗮𝘇𝗵𝗮𝗹 «𝗢𝗳𝗼𝗿𝗺𝗶𝘁𝘆 𝘇𝗮𝗸𝗮𝘇»
⤷ Заказ, оплата и геолокация попадают в Aurora MySQL + DynamoDB.
𝟮. 𝗦𝗼𝗯𝘆𝘁𝗶𝘆𝗮 𝗶𝗱𝘂𝘁 𝘃 𝗞𝗮𝗳𝗸𝗮
⤷ 450M+ сообщений в минуту.
⤷ Отсюда стартуют все downstream-пайплайны.
𝟯. 𝟰 𝗽𝗮𝗽𝗮𝗶𝗻𝗹𝗮𝗶𝗻𝗮 𝘇𝗮𝗽𝘂𝘀𝗸𝗮𝘆𝘂𝘁𝘀𝘆𝗮 (𝗻𝗲 𝟭, 𝗮 𝗰𝗵𝗲𝘁𝘆𝗿𝗲)
MySQL → Sqoop → S3 (пакетный ETL)
MySQL → Debezium CDC → Kafka → Flink → Iceberg (стриминг)
DynamoDB Streams → Spark → S3 (serverless-данные)
App Events → Kafka → Flink → Druid (реалтайм-дашборды)
𝟰. 𝗩𝘀𝗲 𝗽𝗮𝗱𝗮𝗲𝘁 𝘃 𝗦𝟯
⤷ Формат ORC. Таблицы Iceberg.
⤷ Вся система сходится в data lake.
𝟱. 𝗧𝗿𝗶𝗻𝗼 𝗼𝗯𝗿𝗮𝗯𝗮𝘁𝘆𝘃𝗮𝗲𝘁 𝗱𝗮𝘁𝗮𝗹𝗮𝗸𝗲
⤷ 250K+ запросов в неделю. 2 петабайта сканирования.
⤷ 3 типа кластеров: ad-hoc, ETL (через Airflow), отчётность.
⤷ JOIN’ы между MySQL, Druid, Pinot и MongoDB.
𝟲. 𝗗𝗿𝘂𝗶𝗱 𝗱𝗮𝗲𝘁 𝗿𝗲𝗮𝗹𝘁𝗮𝗶𝗺
⤷ 20 млрд событий в неделю. 8 млн запросов в неделю.
⤷ Время ответа — миллисекунды.
𝟳. 𝗞𝗼𝗺𝗮𝗻𝗱𝘆 𝘀𝗺𝗼𝘁𝗿𝘆𝗮𝘁 𝗱𝗮𝘀𝗵𝗯𝗼𝗮𝗿𝗱𝘆
⤷ Superset + Redash + Jupyter
𝗙𝘂𝗹𝗹 𝘀𝘁𝗲𝗸:
- Kafka (450M сообщений/мин)
- Flink, Spark, Sqoop на EMR
- Trino (batch) + Druid (real-time)
- S3 + Iceberg + ORC
- Debezium CDC
- Airflow
- Superset, Redash, Jupyter
В следующий раз, когда закажешь бирьяни в пятницу в 21:00…
заказ проходит через Kafka → Flink → S3 → Trino → дашборд.
в Zomato видят, что заказы бирьяни в Мумбаи выросли на 40%.
всё это почти в реальном времени. Это дата-инжиниринг на масштабе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Oracle Database 26ai расширила конструкцию возврата значений при операциях изменения данных.
Теперь при операциях изменения можно получить значения до и после изменения через OLD и NEW, включая поддержку MERGE.
Пример для UPDATE:
Пример для MERGE:
👉 @SQLPortal
Теперь при операциях изменения можно получить значения до и после изменения через OLD и NEW, включая поддержку MERGE.
Пример для UPDATE:
UPDATE ...
RETURN OLD col, NEW col
INTO :before, :after
Пример для MERGE:
MERGE INTO ...
RETURN OLD col, NEW col
INTO :before, :after
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Старые приёмы работы с Postgres которые могут быть полезны. Пример функция
Можно написать поиск по именам которые звучат как Jon — их не обязательно писать так же или иметь совпадающую триграмму
Такой запрос найдёт "John" "Jon" и даже "Joan"
Больше про
👉 @SQLPortal
soundexМожно написать поиск по именам которые звучат как Jon — их не обязательно писать так же или иметь совпадающую триграмму
SELECT first_name, last_name
FROM customers
WHERE soundex(first_name) = soundex('Jon');
Такой запрос найдёт "John" "Jon" и даже "Joan"
Soundex — это специальный алгоритм для английского произношения. Он берёт первую букву слова и оставляет её в качестве якоря. Остальную часть слова он упрощает сгруппировав согласные в несколько общих категорий звуков. Например согласные которые произносятся с помощью губ как B и P считаются одной группой. Гласные (A E I O U) и мягкие согласные вроде H и W полностью игнорируются так как они мало влияют на основное звучание. В итоге получается стандартизированный код из четырёх символов. Запрос ищет другие совпадения с таким же четырёхсимвольным кодомSoundex заметно слабо работает с текстом на других языках так что с реализацией стоит быть аккуратным. Но он может помочь в некоторых задачах поиска и сортировки особенно если у вас ещё нет ИИ или эмбеддинговБольше про
soundex, полнотекстовый поиск и нечеткое сравнение строк читайте здесь: ссылкаPlease open Telegram to view this post
VIEW IN TELEGRAM
Crunchy Data
Crunchy Data Warehouse: Postgres with Iceberg for High Performance Analytics | Crunchy Data Blog
We are excited to release Crunchy Data Warehouse, a modern data warehouse for Postgres. Crunchy Data Warehouse combines Postgres with Iceberg, Parquet, and data lake formats for fast analytics queries and cost efficient storage.
👍2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Новый клиент для современных баз данных
С встроенным AI и MCP, расширяемый через плагины.
✓ Поддержка PostgreSQL, MariaDB, MySQL и SQLite
✓ Для macOS, Windows и Linux
✓ Переведён на испанский язык
Open source и бесплатный: TabularisDB
👉 @SQLPortal
С встроенным AI и MCP, расширяемый через плагины.
✓ Поддержка PostgreSQL, MariaDB, MySQL и SQLite
✓ Для macOS, Windows и Linux
✓ Переведён на испанский язык
Open source и бесплатный: TabularisDB
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Когда ты пишешь SQL-запрос, порядок команд вроде бы логичен SELECT, FROM, WHERE и тд. Но база данных выполняет их в другом порядке 😄
Настоящая последовательность выполнения👇
💡 Поэтому
На фото слева. то в каком порядке мы обычно пишем SQL-запрос, а справа как реально работает база данных под капотом. Запомни эту логику, и ты избежишь кучи ошибок в SQL-запросах
👉 @SQLPortal
Настоящая последовательность выполнения
FROM
JOIN
ON
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
LIMITWHERE не может использовать SUM() — он идёт до агрегации. А HAVING — можноНа фото слева. то в каком порядке мы обычно пишем SQL-запрос, а справа как реально работает база данных под капотом. Запомни эту логику, и ты избежишь кучи ошибок в SQL-запросах
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🤔1
Если вы всё ещё используете PostgreSQL 14-й версии, вот две важные вещи, которые стоит знать:
Последний релиз от сообщества выйдет уже в этом ноябре.
Вы упускаете 5 лет серьёзных улучшений производительности, новых возможностей и повышения стабильности.
Обновление между мажорными версиями требует подготовки. Изменения в page headers, форматах tuple и оптимизациях индексов означают, что вам потребуется пересобрать индексы и структуры данных. Типичные пути миграции —
Также функции и extensions после обновления могут вести себя иначе, поэтому корректная поведенческая валидация (behavioral validation) критически важна — особенно для production-систем. Так что просто YOLO-обновление тут не вариант.
Но бояться этого тоже не стоит. Улучшения производительности и надёжности в новых версиях PostgreSQL действительно заметны — и ваши запросы, и ваша повседневная работа станут ощутимо приятнее.
https://www.crunchydata.com/blog/examining-postgres-upgrades-with-pg_upgrade
👉 @SQLPortal
Последний релиз от сообщества выйдет уже в этом ноябре.
Вы упускаете 5 лет серьёзных улучшений производительности, новых возможностей и повышения стабильности.
Обновление между мажорными версиями требует подготовки. Изменения в page headers, форматах tuple и оптимизациях индексов означают, что вам потребуется пересобрать индексы и структуры данных. Типичные пути миграции —
pg_dump/restore, pg_upgrade или логическая репликация (logical replication) со всеми её известными ограничениями.Также функции и extensions после обновления могут вести себя иначе, поэтому корректная поведенческая валидация (behavioral validation) критически важна — особенно для production-систем. Так что просто YOLO-обновление тут не вариант.
Но бояться этого тоже не стоит. Улучшения производительности и надёжности в новых версиях PostgreSQL действительно заметны — и ваши запросы, и ваша повседневная работа станут ощутимо приятнее.
https://www.crunchydata.com/blog/examining-postgres-upgrades-with-pg_upgrade
Please open Telegram to view this post
VIEW IN TELEGRAM
Crunchy Data
Examining Postgres Upgrades with pg_upgrade | Crunchy Data Blog
Greg outlines the steps and process for an example upgrade from Postgres version 12 to 16 using the built-in pg_upgrade tool.
5 SQL-советов, которые ускорят ваши запросы и сберегут нервы
🛑 Не злоупотребляйте индексами
🛑 Индексы ускоряют поиск, но замедляют запись и занимают место
🛑 Создавайте их для столбцов в
🛑 Структура запроса важна
🛑 Разбивайте сложные запросы на несколько простых
🛑 Запрашивайте только нужные столбцы
🛑 Оптимизируйте JOIN и WHERE
🛑 Используйте индексы и фильтруйте данные как можно раньше
🛑 Избегайте коррелированных подзапросов
🛑 Переписывайте их через
🛑 Дизайн базы — основа производительности
🛑 Балансируйте между нормализацией (целостность) и денормализацией (производительность)
👉 @SQLPortal
WHERE, JOIN и ORDER BYJOIN или используйте временные таблицыPlease open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2