TGViewer
SQL и Анализ данных SQL и Анализ данных @databases_tg · 12.5K subscribers
Post #1227 3.87K
🖥 SQL-совет по оптимизации - используй DISTINCT ON вместе с правильным индексом (PostgreSQL)

DISTINCT ON часто недооценивают, но в PostgreSQL это один из самых быстрых способов выбрать «последнюю запись на группу» без подзапросов и оконных функций.

Проблема
Нужно получить, например, последнюю запись по каждому user_id, отсортированную по created_at.

Типичное (медленное) решение
- оконная функция ROW_NUMBER()
- подзапрос с GROUP BY + JOIN

Редкое и очень быстрое решение
DISTINCT ON + индекс, совпадающий с ORDER BY.

Пример
Получаем последнюю сессию каждого пользователя.


SELECT DISTINCT ON (user_id)
user_id,
session_id,
created_at
FROM user_sessions
ORDER BY user_id, created_at DESC;


Почему это быстро
PostgreSQL берет первую строку на каждую группу user_id согласно ORDER BY и сразу останавливается - без сортировки всего результата и без оконных функций.

Ключевой момент оптимизации
Нужен правильный индекс, иначе магия не сработает.


CREATE INDEX idx_user_sessions_distinct
ON user_sessions (user_id, created_at DESC);


Что дает такой индекс
- Index Scan вместо Seq Scan
- Нет дополнительной сортировки
- Очень быстрый выбор «последней записи на группу» даже на миллионах строк

Где особенно полезно
- логины пользователей
- события
- статусы
- версии сущностей
- time-series данные

DISTINCT ON - это PostgreSQL-специфичная оптимизация, но если ты работаешь с Postgres, это один из самых мощных и редких трюков.
  • 🔥 13
  • 👍 4
  • ❤ 3
More from @databases_tg
  1. Sep 30, 2026📝 5 уровней ИИ-агентов: от промпта до продакшена Context, loop, Jev, harness и evals: раз…
  2. Sep 26, 2026UPDATE — оператор обновления данных в MySQL 🗂️ Если в таблице нужно изменить значение в у…
  3. Sep 25, 2026🧠 SQL-задача с подвохом Есть таблица транзакций: CREATE TABLE transactions ( id int PRIMA…
  4. Sep 25, 2026Как облегчить работу ИТ-аналитика уже сейчас — без долгосрочных перестроек процессов? Обсу…
  5. Sep 24, 2026🐧 Linux Cheat Sheet - шпаргалка по командам Linux Самая удобная шпаргалка по Linux и Bash…
  6. Sep 23, 2026⚡️ SQL-задача с подвохом Что вернёт этот запрос в PostgreSQL? CREATE TABLE payments ( id i…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →