Оптимизация запроса: самое длинное видео среди топ-10 коротких Контекст: SQL-запросы предназначены для поиска видео и сортировки результатов по длительности Основная задача: определить самое длинное видео среди коротких, предварительно оставив только 10 лучших результатов по длине Главный принцип: разделить обработку на два этапа — сначала получить топ-10 коротких видео, а затем выбрать из них самое длинное Для выделения топ-10 коротких видео применить подзапрос или CTE (WITH), отсортировав записи по длительности — по возрастанию либо по другому критерию, определяющему "короткие" видео Во внешнем запросе выбрать из результата подзапроса…
Как оптимизировать SQL-запрос, чтобы найти самое длинное видео среди топ-10 коротких?
Оптимизация запроса: самое длинное видео среди топ-10 коротких Контекст: SQL-запросы предназначены для поиска видео и сортировки результатов по длительности Основная задача: определить самое длинное видео среди…
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Оптимизация запроса: самое длинное видео среди топ-10 коротких
- Контекст: SQL-запросы предназначены для поиска видео и сортировки результатов по длительности
- Основная задача: определить самое длинное видео среди коротких, предварительно оставив только 10 лучших результатов по длине
- Главный принцип: разделить обработку на два этапа — сначала получить топ-10 коротких видео, а затем выбрать из них самое длинное
- Для выделения топ-10 коротких видео применить подзапрос или CTE (WITH), отсортировав записи по длительности — по возрастанию либо по другому критерию, определяющему "короткие" видео
- Во внешнем запросе выбрать из результата подзапроса видео с наибольшей длительностью
- Для повышения скорости создать и задействовать индекс по длине видео, например по полю duration или length
- Важно сократить объём данных в подзапросе, чтобы избежать полной сортировки всей таблицы
- В PostgreSQL это можно реализовать следующим образом
sql WITH TopShortVideos AS ( SELECT * FROM videos WHERE duration < <короткий_порог> ORDER BY duration ASC LIMIT 10 ) SELECT * FROM TopShortVideos ORDER BY duration DESC LIMIT 1; - Такой вариант сначала эффективно ограничивает выборку десятью видео с наименьшей длительностью, а затем быстро находит среди них запись с максимальной длиной
- Если требуются дополнительные фильтры или условия, альтернативой могут стать оконные функции (ROW_NUMBER/PARTITION)
- Итоговый подход сочетает поэтапную обработку, индексы и минимальный объём данных, передаваемых во внешний запрос
В результате база данных вернёт ответ быстро и с минимальной нагрузкой.
Подробный ответ
Основной ответ
Для оптимизации запроса, который должен найти самое длинное видео среди топ-10 коротких, сначала необходимо однозначно задать критерий "коротких" и определить принцип отбора — например, по рейтингу, дате или числу просмотров. Предполагается, что у видео есть отдельная метрика ранжирования, например популярность, и требуется найти максимальную длительность среди десяти лучших видео с небольшой продолжительностью. Основная оптимизация заключается в сокращении объёма обрабатываемых данных и правильном использовании индексов.
Ключевые моменты
- Выборка ограниченного поднабора: на первом этапе получить топ-10 коротких видео, например
ORDER BY rating DESC LIMIT 10при условииduration < X, чтобы уменьшить объём данных для дальнейшего поиска. - Индексация полей: создать индекс по длительности (
duration) и по полю, используемому для формирования топ-10, напримерrating. Это ускорит фильтрацию и сортировку. - Использование подзапроса или CTE: не следует искать максимальную длительность сразу по всей таблице. Сначала нужно сформировать поднабор из топ-10 коротких видео, а затем выбрать из него самое длинное.
- Минимизация количества обрабатываемых строк: если не ограничить результат топ-10, СУБД может выполнить полный скан таблицы.
Пример SQL для PostgreSQL 14+:
WITH top_short_videos AS (
SELECT * FROM videos
WHERE duration < 300 -- критерий "коротких" в секундах
ORDER BY rating DESC
LIMIT 10
)
SELECT * FROM top_short_videos
ORDER BY duration DESC
LIMIT 1;
Практический контекст
В реальных проектах с большими каталогами видео особенно важно правильно настроить индексы — например, B-tree по duration и rating. Иногда топ-10 коротких видео кэшируют в Redis, чтобы мгновенно находить среди них самое длинное и уменьшать нагрузку на БД. При редко изменяющихся данных также применяют материализованные представления: это помогает повысить производительность и снизить latency. Для подобных запросов в продакшене хорошим результатом считается показатель около ~50ms.