Когда одно и то же выражение постоянно считается в
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. Сгенерированные колонки отлично подходят для повторяющихся вычислений:➡️ SQL Ready | #практика