Когда подходящее время использовать оператор SQL «SELECT [результаты] FROM [таблицы] WHERE [условия] FETCH FIRST [n] ROWS ONLY»

StackOverflow https://stackoverflow.com/questions/400575

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Я знаю два распространенных варианта использования:

Пейджинг:обязательно уточняйте заказ.Если порядок не указан, многие реализации БД используют все, что удобно для выполнения запроса.Такое «оптимальное» поведение упорядочения может дать очень непредсказуемые результаты.

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. Показывайте только самые релевантные результаты (скажем, 100 лучших) без необходимости переносить все строки из БД клиенту.В этом случае мы также используем ORDER BY.

  2. Мы просто хотим знать, есть ли совпадающие строки, и привести несколько примеров.В этом случае мы не упорядочиваем результаты, и опять же, FETCH FIRST намного дешевле, чем подготовка БД к передаче большого количества строк, а затем их отправка клиенту.Обычно это происходит во время разработки программного обеспечения, когда необходимо понять, верен ли определенный SQL.

Если вы хотите отобразить значения пользователю, вам, скорее всего, понадобится только N строк.Обычно сервер базы данных может получить первые N строк быстрее, чем все строки, поэтому перерисовка экрана может происходить немного быстрее.

У Oracle даже есть подсказка под названием FIRST_ROWS, которая предполагает, что быстрое возвращение данных важнее, чем эффективное возвращение всех этих данных.

Разработчики SQL согласны с вами, поэтому стандартный SQL не включает сначала top/limit/fetch и т.д.

Подумайте о результатах поиска Google и количестве страниц, которые обычно содержат результаты.

Хотя, очевидно, в их случае есть нечто большее, но в этом вся идея.

Помимо разбиения на страницы, каждый раз, когда вам нужна самая большая или наименьшая [вставьте сюда метрику] строка из таблицы, упорядочивание по [любой метрике] и ограничение до 1 строки, IME, лучше, чем выполнение подзапроса с использованием MIN/MAX.Может варьироваться в зависимости от двигателя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top