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
👍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
This media is not supported in your browser
VIEW IN TELEGRAM
Open-source инструмент Text2SQL, который превращает запросы на естественном языке в SQL, используя понимание схемы на базе графа. Задавай вопросы к базе простым языком, а QueryWeaver сам сделает всю склейку и соберет нужный SQL.
https://github.com/FalkorDB/QueryWeaver
👉 @SQLPortal
https://github.com/FalkorDB/QueryWeaver
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Не используй CASE в WHERE
Один из самых частых SQL анти-паттернов это пихать
Классический пример:
Работает, но часто убивает производительность, потому что
Лучше переписать так:
Этот вариант лучше, потому что логика становится прямолинейной и без лишних условий. Запрос проще читать, проще поддерживать, и оптимизатору проще рассуждать о предикатах, потому что они “голые”, без обертки в логическое ветвление.
👉 @SQLPortal
Один из самых частых SQL анти-паттернов это пихать
CASE прямо в WHERE, чтобы разрулить условную логику для диапазонов или фильтров.Классический пример:
SELECT * FROM products
WHERE
CASE WHEN category = 'Electronics' THEN price < 500 ELSE price < 100 END;
Работает, но часто убивает производительность, потому что
CASE делает предикат не SARGable в большинстве популярных СУБД. Оптимизатор уже не может нормально сделать index seek по индексу на price (или по составному индексу (category, price)). В итоге нередко получаешь full table scan, даже если индексы отличные.Лучше переписать так:
SELECT * FROM products
WHERE price < 100
OR (category = 'Electronics' AND price < 500);
Этот вариант лучше, потому что логика становится прямолинейной и без лишних условий. Запрос проще читать, проще поддерживать, и оптимизатору проще рассуждать о предикатах, потому что они “голые”, без обертки в логическое ветвление.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2
Вопрос по SQL
Нужно получить:
- все товары дешевле 100
- плюс товары из категории
Какое условие корректно вернет такой результат?
A)
B)
C)
👉 @SQLPortal
Нужно получить:
- все товары дешевле 100
- плюс товары из категории
Electronics дешевле 500Какое условие корректно вернет такой результат?
A)
price < 100 AND category = 'Electronics' OR price < 500
B)
price < 100 OR (category = 'Electronics' AND price < 500)
C)
(price < 100 OR category = 'Electronics') AND price < 500
Please open Telegram to view this post
VIEW IN TELEGRAM
Если используешь COUNT вместе с CASE, не ставь ELSE 0
Пример:
Это неправильно и даст некорректный результат. Когда ты пишешь
Лучше так: убрать
Единственный случай, когда
👉 @SQLPortal
Пример:
SELECT
Department,
COUNT(CASE WHEN Status = 'Active' THEN EmployeeID ELSE 0 END) AS ActiveCount
FROM Employees
GROUP BY Department;
Это неправильно и даст некорректный результат. Когда ты пишешь
ELSE 0, COUNT начинает считать нули как значения. COUNT игнорирует только NULL, а ноль это не NULL. Поэтому если в отделе 10 активных и 5 неактивных сотрудников, запрос вернет 15 для ActiveCount, потому что посчитает все 15 строк (10 EmployeeID + 5 нулей).Лучше так: убрать
ELSE 0:SELECT
Department,
COUNT(CASE WHEN Status = 'Active' THEN EmployeeID END) AS ActiveCount
FROM Employees
GROUP BY Department;
ELSE тут не нужен. Если условие не выполняется, выражение вернет NULL, а COUNT NULL-ы не считает. Еще более явно можно написать так:SELECT
Department,
COUNT(CASE WHEN Status = 'Active' THEN 1 END) AS ActiveCount
FROM Employees
GROUP BY Department;
Единственный случай, когда
ELSE 0 будет уместен, это если вместо COUNT ты используешь SUM.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2
Наити работу на немецком рынке. И не через релокацию! Сам нашел и сам переехал!
Это история Бизнес аналитика, который работает в Deutsche Bank и язвительно пишет из солнечного Франкфурта-на-Майне.
Из ХЗ в ТЗ — блог про работу в финтехе и как там у них. Антон также исследует рынок РФ и продолжает ходить на собеседования.
Истории, которые уже вышли:
🟢 собеседование в банк Азии. Кринж😬
🟢 красные флаги в тестовом задании. И референс ответа.
🟢 как мы делали mit den Jungs в банке
🟢 стал бы я в 2026-ом накручивать опыт в резюме?
Переходите знакомиться: @anton_alekseev
Это история Бизнес аналитика, который работает в Deutsche Bank и язвительно пишет из солнечного Франкфурта-на-Майне.
Из ХЗ в ТЗ — блог про работу в финтехе и как там у них. Антон также исследует рынок РФ и продолжает ходить на собеседования.
Истории, которые уже вышли:
🟢 собеседование в банк Азии. Кринж😬
🟢 красные флаги в тестовом задании. И референс ответа.
🟢 как мы делали mit den Jungs в банке
🟢 стал бы я в 2026-ом накручивать опыт в резюме?
Переходите знакомиться: @anton_alekseev
💊3❤1👍1🔥1
Использование
👉 @SQLPortal
SKIP LOCKED в Postgres в запросах или процессах позволяет строить очереди задач, гарантируя, что отдельные строки обрабатываются внутри транзакции без блокировки при одновременной работе нескольких экземпляров джобы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2