SKIP LOCKED позволяет управлять конкурентным доступом на уровне строки, а не всей таблицы, поэтому воркеры не ждут друг друга и не создают лишних блокировок.Сегодня в гайде:
• Забираем задачи параллельно и без конфликтов;
• Делаем атомарный “взять + обновить” в одном запросе;
• Распределяем очереди между воркерами под высокой нагрузкой.
Этот прием делает обработку задач масштабируемой даже при высоком параллелизме.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤11👍6🤝1
Сгенерированные колонки в PostgreSQL: ускоряем фильтры без лишних вычислений!
Когда одно и то же выражение постоянно считается в
Создаём таблицу с материализованным выражением:
Теперь
Фильтрация становится проще и быстрее:
Добавляем индекс:
Проверяем:
🔥 Должен быть
➡️ SQL Ready | #практика
Когда одно и то же выражение постоянно считается в
WHERE, запросы тормозят. В PostgreSQL это решается GENERATED ALWAYS AS … STORED — выражение вычисляется один раз и хранится как обычное поле.Создаём таблицу с материализованным выражением:
CREATE TABLE events (
id BIGSERIAL PRIMARY KEY,
payload JSONB NOT NULL,
event_type TEXT GENERATED ALWAYS AS (payload->>'type') STORED
);
Теперь
event_type больше не вычисляется на лету — значение лежит прямо в строке.Фильтрация становится проще и быстрее:
SELECT id
FROM events
WHERE event_type = 'purchase';
Добавляем индекс:
CREATE INDEX idx_events_event_type
ON events(event_type);
Проверяем:
EXPLAIN ANALYZE
SELECT id
FROM events
WHERE event_type = 'purchase';
Index Scan, без тяжёлых операций над JSONB. Сгенерированные колонки отлично подходят для повторяющихся вычислений:Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍10❤7
Соберём все возможные маршруты из аэропорта A в B — прямые, через одну пересадку и через две, без рекурсий и сложных конструкций.
В этом посте:
• Проверим, существует ли прямой путь, простой случай, но часто самый важный;
• Расширим поиск и найдём маршруты вида A => X => B, где X — автоматически вычисленная пересадка;
• Построим цепочки A => X => Y => B, что по сути является маленьким обходом графа.
Это базовая техника работы с графами, подходит для поиска зависимостей, цепочек действий и любых последовательностей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤8👍8🤝1
Нужно получить список всех дней, даже тех, которых нет в таблице?
Например, показать дни без заказов. PostgreSQL умеет генерировать последовательности прямо в запросе:
Никаких временных таблиц, никаких циклов.
Теперь можно объединить это с данными:
🔥 Пригодится для аналитики временных рядов,
заполнения пропусков и построения отчётов!
➡️ SQL Ready | #совет
Например, показать дни без заказов. PostgreSQL умеет генерировать последовательности прямо в запросе:
SELECT *
FROM generate_series('2025-01-01', '2025-01-31', interval '1 day');
generate_series() создаёт виртуальную таблицу с шагом по дате.Никаких временных таблиц, никаких циклов.
Теперь можно объединить это с данными:
SELECT g.day, COUNT(o.id) AS total
FROM generate_series('2025-01-01', '2025-01-31', interval '1 day') AS g(day)
LEFT JOIN orders o ON date(o.created_at) = g.day
GROUP BY g.day
ORDER BY g.day;
заполнения пропусков и построения отчётов!
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝14❤9👍7🔥1
В этой шпаргалке собраны функции MySQL, применяемые для получения отдельных компонентов даты и времени: года, месяца, дня, часов, минут, секунд, номера недели и дня недели. Эти операции используются в большинстве рабочих запросов — от фильтрации и группировки данных до подготовки отчётов и временной аналитики.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🤝9❤7
UNNEST + WITH ORDINALITY — управляемая распаковка массивов в PostgreSQL!
Обычный
В PostgreSQL есть решение —
Пример: распакуем массив ингредиентов с сохранением порядка:
В отличие от обычного
Соберём обратно отсортированный список:
Работа с JSON-массивами:
🔥 Используйте
➡️ SQL Ready | #практика
Обычный
UNNEST() не сохраняет позицию элемента, что критично, когда важен порядок: восстановление списков, сортировка, работа с JSON-массивами.В PostgreSQL есть решение —
WITH ORDINALITY. Оно добавляет индекс элемента прямо при распаковке.Пример: распакуем массив ингредиентов с сохранением порядка:
SELECT recipe_id, ingredient, ord
FROM recipes,
UNNEST(ingredients) WITH ORDINALITY AS t(ingredient, ord);
В отличие от обычного
UNNEST(), здесь мы сразу получаем порядковый номер — без оконных функций и без дополнительных JOIN.Соберём обратно отсортированный список:
SELECT recipe_id,
STRING_AGG(ingredient, ', ' ORDER BY ord) AS ordered_list
FROM (
SELECT recipe_id, ingredient, ord
FROM recipes,
UNNEST(ingredients) WITH ORDINALITY t(ingredient, ord)
) q
GROUP BY recipe_id;
Работа с JSON-массивами:
SELECT order_id,
item ->> 'name' AS name,
item ->> 'price' AS price,
ord
FROM orders,
jsonb_array_elements(items) WITH ORDINALITY AS t(item, ord);
WITH ORDINALITY в PostgreSQL, когда критична позиция элемента в массиве или JSON-списке.Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤8🔥7
This media is not supported in your browser
VIEW IN TELEGRAM
Хочешь быстро вспомнить команды для запросов, объединений таблиц или операций с данными? На этом сайте найдёшь множество готовых подсказок. Отлично подойдёт, если учишь SQL, готовишься к собесу или просто не хочешь каждый раз гуглить синтаксис.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤8🔥7