Как убрать тормоза ORM на 80% с помощью грамотных индексов в PostgreSQL
Современные приложения часто плотно завязаны на ORM (Object-Relational Mapper) ради быстрой разработки. ORM реально ускоряют разработку, но при этом нередко генерируют запросы, которые не до конца оптимальны с точки зрения производительности базы. В такой ситуации у инженеров по БД мало контроля над тем, как именно выглядят запросы, поэтому индексация и тюнинг базы остаются главными инструментами для ускорения.
В этой статье покажут, как чуваки заметно улучшили производительность PostgreSQL для одного из их enterprise-клиентов, применив стратегическую индексацию и не меняя запросы приложения.
👉 @SQLPortal
Современные приложения часто плотно завязаны на ORM (Object-Relational Mapper) ради быстрой разработки. ORM реально ускоряют разработку, но при этом нередко генерируют запросы, которые не до конца оптимальны с точки зрения производительности базы. В такой ситуации у инженеров по БД мало контроля над тем, как именно выглядят запросы, поэтому индексация и тюнинг базы остаются главными инструментами для ускорения.
В этой статье покажут, как чуваки заметно улучшили производительность PostgreSQL для одного из их enterprise-клиентов, применив стратегическую индексацию и не меняя запросы приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Stormatics
Fixing ORM Slowness by 80% with Strategic PostgreSQL Indexing | Stormatics
Boost PostgreSQL performance by 80% with strategic indexing, reduce sequential scans and IOPS without changing application code.
👍1
Хватит объяснять SQL JOIN’ы через диаграммы Венна.
Вот 4 картинки, которые показывают это намного логичнее:
👉 @SQLPortal
Вот 4 картинки, которые показывают это намного логичнее:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14😁1
Один чувак написал подробный разбор того, как базы данных на самом деле выполняют JOIN'ы.
В этом разборе он объясняет, какие алгоритмы работают под капотом, когда мы используем JOIN: nested loop join, hash join, merge join, index join, grace hash join и broadcast join, а также почему query planner выбирает один вариант вместо другого.
Если тебе было интересно, почему в одном случае JOIN срабатывает мгновенно, а в другом ужасно тормозит, или как базы данных эффективно джойнят таблицы с миллиардами строк, этот материал поможет собрать четкую ментальную модель. Почитай.
👉 @SQLPortal
В этом разборе он объясняет, какие алгоритмы работают под капотом, когда мы используем JOIN: nested loop join, hash join, merge join, index join, grace hash join и broadcast join, а также почему query planner выбирает один вариант вместо другого.
Если тебе было интересно, почему в одном случае JOIN срабатывает мгновенно, а в другом ужасно тормозит, или как базы данных эффективно джойнят таблицы с миллиардами строк, этот материал поможет собрать четкую ментальную модель. Почитай.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Нужно быстро поднять PostgreSQL для MVP или pet-проекта?
В MWS Cloud Platform база данных PostgreSQL разворачивается за минуты и сразу готова к работе:
Подходит для любого проекта — от интернет-магазина до высоконагруженного backend-сервиса.
🆓 До 31 марта production-ready PostgreSQL в облаке — бесплатно
🔥 Запустите свой проект, протестируйте под нагрузкой и спокойно оставляйте базу в продакшене.
Попробовать бесплатно*
* Скидка 100% на оплату сервиса Managed PostgreSQL предоставляется в период с 9 февраля по 31 марта 2026 года для участников акции. Подробные условия — по ссылке
В MWS Cloud Platform база данных PostgreSQL разворачивается за минуты и сразу готова к работе:
⏺️ готовые конфигурации CPU и RAM под разные типы нагрузок⏺️ high availability или standalone конфигурации, автоматические бэкапы⏺️ гарантированные мощности CPU, консистентный API и удобный cloud-native IAM⏺️ сетевые или сверхбыстрые NVMe-диски под разные сценарии⏺️ постоянный primary endpoint: адрес не меняется при failover или switchover⏺️ до 3 read-only точек подключения — удобно для подключения аналитики⏺️ поддержка популярных расширений PostgreSQL "из коробки"
Подходит для любого проекта — от интернет-магазина до высоконагруженного backend-сервиса.
Попробовать бесплатно*
* Скидка 100% на оплату сервиса Managed PostgreSQL предоставляется в период с 9 февраля по 31 марта 2026 года для участников акции. Подробные условия — по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
В PostgreSQL 19 (dev) прилетели еще 2 полезных изменения:
1. Разрешили
2. Запретили
Небольшие изменения, но оба коммита полезные:
- первый про более гибкую работу с virtual columns
- второй про ужесточение/санитизацию имен и снижение странных кейсов
👉 @SQLPortal
1. Разрешили
ALTER COLUMN SET EXPRESSION для виртуальных столбцов с CHECK-ограничениями 2. Запретили
CR и LF в именах баз данных, ролей и табличных пространств Небольшие изменения, но оба коммита полезные:
- первый про более гибкую работу с virtual columns
- второй про ужесточение/санитизацию имен и снижение странных кейсов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
В Postgres можно делать функциональные индексы для запросов, которые приходят в конкретном формате. Например, для
👉 @SQLPortal
TIMESTAMP, когда в запросе фильтрация идет только по дате:CREATE INDEX idx_orders_dt_only ON orders ((created_at::date));
SELECT count(*) FROM orders WHERE created_at::date = '2024-05-20';
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤯2❤1
В Postgres 18 появился новый метод клонирования для создания баз данных из шаблонных (template) БД, который работает заметно быстрее, чем другие способы. Это работает на конкретных файловых системах, которые поддерживают copy-on-write / reflink.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Какой SQL-запрос работает быстрее?
vs
👉 @SQLPortal
SELECT * FROM orders
WHERE status = 'NEW'
OR status = 'PENDING'
OR status = 'PROCESSING';
vs
SELECT * FROM orders
WHERE status IN ('NEW', 'PENDING', 'PROCESSING');
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔7❤2
Перестань переписывать JOIN через ON; используй USING
Если ты давно пишешь JOIN’ы в SQL, ты наверняка привык к
Вот почему стоит подумать о переходе.
Намного чище, да?
Перейти на
👉 @SQLPortal
Если ты давно пишешь JOIN’ы в SQL, ты наверняка привык к
ON. Оно работает и делает свою работу. Но когда ты джоинишь две таблицы по колонкам с абсолютно одинаковым именем, есть более чистый и аккуратный вариант: USING.Вот почему стоит подумать о переходе.
SELECT
e.Employee_ID,
e.Employee_Name,
e.Department,
s.Net_Sales
FROM Employees e
JOIN sales s
ON e.Employee_ID = s.Employee_ID;
ON ок, но оно многословное. Приходится повторять и имена таблиц, и имена колонок. Если имя колонки одинаковое в обеих таблицах, ты по сути пишешь одно и то же дважды. Хуже того: когда выбираешь колонки, можешь получить два столбца Employee_ID, если явно не квалифицировать их.USING это сокращение для join’ов по равенству, когда колонки называются одинаково. Та же самая выборка будет такой:SELECT
e.Employee_ID,
e.Employee_Name,
e.Department,
s.Net_Sales
FROM Employees e
JOIN sales s
USING (Employee_ID);
Намного чище, да?
USING автоматически сопоставляет колонки с одинаковым именем и делает inner join (или left/right join, в зависимости от типа join). Ты указываешь имя колонки один раз.Перейти на
USING это маленькое изменение, которое делает SQL короче и более “самодокументируемым”. Меньше шансов ошибиться, и результирующий набор получается аккуратнее. В следующий раз, когда джоинишь по одинаково названным колонкам, выкинь ON и попробуй USING. Только проверь, что твоя СУБД поддерживает USING.Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
В Postgres есть unlogged-таблицы: для них отключается Write-Ahead Logging (WAL). За счёт этого запись становится заметно быстрее, но очевидная цена — такие таблицы не реплицируются через WAL и после крэша/перезапуска их содержимое не восстанавливается (по сути, данные считаются временными). В некоторых сценариях этот размен реально оправдан.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥3
JSONB-колонки Postgres и TOAST: гайд по производительности
Postgres даёт огромный набор фич на уровне пользователя под кучу разных кейсов, а под капотом там довольно сложная абстракция.
Работа с API и массивами в типе
Но зачем вообще “нарезать” JSON-объект на строки и колонки, а потом собирать его обратно, чтобы отправить клиенту?
Ответ: эффективность. Postgres быстрее всего работает со строками и колонками, а когда ты прячешь структуру данных внутрь JSON, движку сложнее разогнаться на максимум, как он мог бы.
👉 @SQLPortal
Postgres даёт огромный набор фич на уровне пользователя под кучу разных кейсов, а под капотом там довольно сложная абстракция.
Работа с API и массивами в типе
jsonb в последнее время стала заметно популярнее, и хранить куски данных приложения в jsonb превратилось в распространённый паттерн.Но зачем вообще “нарезать” JSON-объект на строки и колонки, а потом собирать его обратно, чтобы отправить клиенту?
Ответ: эффективность. Postgres быстрее всего работает со строками и колонками, а когда ты прячешь структуру данных внутрь JSON, движку сложнее разогнаться на максимум, как он мог бы.
Please open Telegram to view this post
VIEW IN TELEGRAM
Snowflake
Postgres JSONB Columns and TOAST: A Performance Guide
Understand how Postgres handles variable-length JSONB data using The Oversize Attribute Storage Technique (TOAST). Explore techniques to avoid the TOAST tax and efficiently retrieve your data.
Проверенные каналы по безопасности, которые реально помогают расти.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Краткая шпаргалка по SQL с примерами запросов
https://github.com/enochtangg/quick-SQL-cheatsheet
👉 @SQLPortal
https://github.com/enochtangg/quick-SQL-cheatsheet
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - enochtangg/quick-SQL-cheatsheet: A quick reminder of all SQL queries and examples on how to use them.
A quick reminder of all SQL queries and examples on how to use them. - GitHub - enochtangg/quick-SQL-cheatsheet: A quick reminder of all SQL queries and examples on how to use them.
👍2
Cтатья про ACID-свойства.
Не только теория, но и практическая реализация на PostgreSQL с примерами из реальной жизни.
Этот пост отлично зайдет новичкам, которые хотят начать разбираться в базах данных, и он же нужен как база перед моей серией про внутренности PostgreSQL.
👉 @SQLPortal
Не только теория, но и практическая реализация на PostgreSQL с примерами из реальной жизни.
Этот пост отлично зайдет новичкам, которые хотят начать разбираться в базах данных, и он же нужен как база перед моей серией про внутренности PostgreSQL.
Please open Telegram to view this post
VIEW IN TELEGRAM
Medium
ACID Properties Explained: A Complete Guide with PostgreSQL Implementation
ACID Properties for Beginners. Not only theory but also practicle implementation using PostgreSQL.
Поток данных в Postgres для чтения/записи:
Приложение --> (опционально) пулер --> отдельный backend/клиентское соединение --> shared buffers --> кэш ОС (page cache) --> физический диск.
При чтении к кэшу ОС или диску обращается только если нужных страниц нет в shared buffers.
👉 @SQLPortal
Приложение --> (опционально) пулер --> отдельный backend/клиентское соединение --> shared buffers --> кэш ОС (page cache) --> физический диск.
При чтении к кэшу ОС или диску обращается только если нужных страниц нет в shared buffers.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1