Поток данных в 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