Я не совсем уверен, что лучше выбрать только определенное количество строк, чем просто сделать более конкретный оператор выбора. У меня такое чувство, что я упускаю что-то довольно прямолинейное, но я не могу этого понять. У меня менее 6 месяцев опыта работы с любым SQL, и это было поверхностно, поэтому мне очень жаль, если это действительно простой вопрос, но я не смог найти четкого ответа.


Пользовательское разбиение на страницы, как правило.
Когда вы хотите отобразить значения для пользователя, вам, скорее всего, понадобится только N строк. Обычно сервер базы данных может получить первые N строк быстрее, чем все строки, поэтому перерисовка экрана может выполняться немного быстрее.
У Oracle даже есть подсказка под названием FIRST_ROWS, которая предполагает, что быстрое получение данных более важно, чем их эффективное получение.
Мы используем это утверждение по следующим причинам:
Показывать только самые релевантные результаты (скажем, 100 лучших) без необходимости передавать все строки из БД клиенту. В этом случае мы также используем ORDER BY.
Мы просто хотим знать, есть ли совпадающие строки, и иметь несколько примеров. В этом случае мы не упорядочиваем результаты, и снова FETCH FIRST намного дешевле, чем подготовка базы данных к передаче большого количества строк, а затем их выбрасывание клиенту. Обычно это происходит во время разработки программного обеспечения, когда нужно понять, верен ли определенный SQL.
Разработчики SQL согласны с вами, поэтому стандартный SQL не включает сначала top / limit / fetch и т. д.
Подумайте о результатах поиска Google и количестве страниц, которые обычно содержат результаты.
Хотя очевидно, что в их случае это гораздо больше, но идея в этом.
Я знаю два распространенных использования:
Пейджинг: обязательно укажите заказ. Если порядок не указан, многие реализации db используют все, что удобно для выполнения запроса. Такой «оптимальный» порядок действий может дать очень непредсказуемые результаты.
SELECT top 10 CustomerName
FROM Customer
WHERE CustomerID > 200 --start of page
ORDER BY CustomerID
Подзапросы: многие места, в которых может быть выдан подзапрос, требуют, чтобы результатом было одно значение. top 1 во многих случаях просто быстрее, чем max.
--give me some customer that ordered today
SELECT CustomerName
FROM Customer
WHERE CustomerID =
(
SELECT top 1 CustomerID
FROM Orders
WHERE OrderDate = @Today
)
Помимо разбиения по страницам, в любое время, когда вы хотите получить наибольшую или наименьшую [вставьте здесь метрику] строку из таблицы, упорядочивание по [любой метрике] и ограничение до 1 строки - это IME, лучше, чем выполнение подзапроса с использованием MIN / MAX. Может отличаться в зависимости от двигателя.