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