Сгенерированные колонки в 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
👍11🔥9❤8🤝1
GENERATE_SERIES превращает PostgreSQL в гибкий источник диапазонов: дат, чисел, временных интервалов без таблиц и вспомогательных скриптов.В сегодняшнем гайде:
• Строим календарь напрямую в запросе;
• Закрываем пропуски в отчётах и логах;
• Генерируем тестовые данные и последовательности для расчётов;
• Создаём временные ряды и интервалы.
Приём, который экономит время, упрощает аналитику и делает запросы выразительнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥8❤7🤝2