Когда уместно использовать SQL-выражение «SELECT [результаты] из [таблиц] ГДЕ [условия] FETCH FIRST [n] ROWS ONLY» - PullRequest
2 голосов
/ 30 декабря 2008

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

Ответы [ 7 ]

5 голосов
/ 30 декабря 2008

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

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

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
)
2 голосов
/ 30 декабря 2008

Мы используем заявление по следующим причинам:

  1. Показывать только самые релевантные результаты (скажем, 100 лучших) без необходимости переноса всех строк из БД в клиент. В этом случае мы также используем ORDER BY.

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

2 голосов
/ 30 декабря 2008

Пользовательский пейджинг, обычно.

0 голосов
/ 30 декабря 2008

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

0 голосов
/ 30 декабря 2008

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

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

0 голосов
/ 30 декабря 2008

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

0 голосов
/ 30 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...