Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: sql, optimization, query, index

Как оптимизировать запрос для поиска самого длинного видео из топ-10 коротких?

Этот вопрос проверяет умение оптимизировать SQL-запросы для работы с данными, включая сортировку и ограничение выборки.

Короткий ответ

Чтобы найти самое длинное видео из топ-10 коротких, нужно отсортировать видео по длительности в порядке возрастания, взять первые 10 записей, а затем выбрать из них видео с максимальной длительностью. Оптимизация достигается с помощью индексов и правильной структуры запроса. Например, можно использовать подзапрос или CTE (Common Table Expression).

Длинный ответ

Оптимизация запроса для поиска самого длинного видео из топ-10 коротких требует понимания структуры данных, индексов и работы СУБД. Предположим, у нас есть таблица videos с полями id, title, и duration (длительность в секундах).

1. Формулировка задачи

  • Нужно выбрать 10 самых коротких видео (сортировка по duration ASC).

  • Из них найти видео с максимальной длительностью.

  • Запрос должен быть быстрым и эффективным.

2. Решение с помощью SQL

Один из способов — использовать подзапрос или CTE для получения топ-10, а затем выбрать максимум.

Пример с CTE:

WITH ShortVideos AS ( SELECT id, title, duration FROM videos ORDER BY duration ASC LIMIT 10 ) SELECT id, title, duration FROM ShortVideos ORDER BY duration DESC LIMIT 1;

  • Что делает запрос:

    • CTE ShortVideos выбирает 10 видео с наименьшей длительностью.

    • Внешний запрос сортирует эти 10 видео по убыванию длительности и берет первое (самое длинное).

3. Оптимизация

Для ускорения запроса важно учитывать:

  • Индексы: Создайте индекс на столбец duration, чтобы ускорить сортировку.

    CREATE INDEX idx_videos_duration ON videos(duration);

  • Ограничение выборки: Использование LIMIT минимизирует объем обрабатываемых данных.

  • Проверка плана запроса: Используйте EXPLAIN для анализа производительности:

    EXPLAIN WITH ShortVideos AS ( SELECT id, title, duration FROM videos ORDER BY duration ASC LIMIT 10 ) SELECT id, title, duration FROM ShortVideos ORDER BY duration DESC LIMIT 1;

4. Альтернативный подход

Можно использовать оконные функции (window functions) для упрощения логики:

SELECT id, title, duration FROM ( SELECT id, title, duration, ROW_NUMBER() OVER (ORDER BY duration ASC) AS rank FROM videos ) ranked WHERE rank <= 10 ORDER BY duration DESC LIMIT 1;

  • Преимущество: Оконные функции позволяют избежать вложенных запросов, что иногда улучшает читаемость.

5. Проблемы и решения

  • Большой объем данных: Если таблица содержит миллионы записей, индекс на duration критически важен.

  • Сложные условия: Если нужно учитывать дополнительные фильтры (например, видео определенного жанра), добавьте их в WHERE до сортировки.

    WHERE genre = 'shorts' AND duration IS NOT NULL

Когда использовать:

  • Подобные запросы применяются в системах рекомендаций или аналитики, где нужно найти "пограничные" записи (например, самое длинное видео среди коротких).

  • CTE и оконные функции подходят для сложных выборок с сортировкой.

Вывод:
Оптимизация таких запросов требует индексов и правильной структуры (CTE или оконные функции). Выбор подхода зависит от размера данных и сложности условий.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    2

  • Сложность:

    6

Навыки

  • Postgres

    Postgres

Ключевые слова

#sql

#optimization

#query

#index

Подпишись на Python Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.