Что делает OPTION FAST в операторе SELECT?

29

Я немного покопался в том, что OPTION (FAST XXX)подсказка запроса делает внутри SELECTоператора, и все еще в замешательстве. По данным MSDN:

Указывает, что запрос оптимизирован для быстрого поиска первых number_rows. Это неотрицательное целое число. После возвращения первых number_rows запрос продолжает выполнение и выдает полный набор результатов.

Для меня это не имеет особого смысла, но в основном запрос может получить первые XXX строки действительно быстрее, чем остальные с нормальной скоростью?

Запрос Microsoft Dynamics, который заставил меня задуматься над этим:

select pjproj.project,pjproj.project_desc,pjproj.customer,pjproj.cpnyid
from pjproj WITH (NOLOCK)
where project like  '%'
order by project OPTION(FAST 500)

Может кто-нибудь объяснить точно, что делает этот запрос подсказка, и это преимущество перед тем, как не использовать его?

Мэтью Верстраете
источник

Ответы:

24

A FAST Nскажет SQL Server сгенерировать план выполнения с быстрым возвращением количества строк, определенных как N.

Обратите внимание, что оценки будут в соответствии с тем, Nкак вы говорите серверу SQL для получения Nстрок как можно быстрее.

например, работает под запросом с fast 500:

-- total rows : 19972
 SELECT [BusinessEntityID]
      ,[TotalPurchaseYTD]
      ,[DateFirstPurchase]
      ,[BirthDate]
      ,[MaritalStatus]
      ,[YearlyIncome]
      ,[Gender]
      ,[TotalChildren]
      ,[NumberChildrenAtHome]
      ,[Education]
      ,[Occupation]
      ,[HomeOwnerFlag]
      ,[NumberCarsOwned]
  FROM [AdventureWorks2012].[Sales].[vPersonDemographics]
  order by BusinessEntityID
  option (fast 500)

Есть против фактических строк с option (fast 500)

введите описание изображения здесь

Есть против фактических строк без option (fast 500)

введите описание изображения здесь

Сценарий использования может быть, когда приложение выполняет кэширование (загружает большой объем данных в фоновом режиме) и хочет показать пользователю часть данных как можно быстрее.

Еще один интересный случай использования в земле SSIS, который Роб Фарли описывает FAST Nкак катализатор, ускоряющий поиск данных.

Добавив эту подсказку, вы почувствовали, как волшебная палочка была переброшена по запросу, чтобы она работала в несколько раз быстрее.

Смотрите также ответ Ремуса Русану .

Кин Шах
источник
11

Когда вы используете этот запрос с подсказкой OPTION (FAST n), оптимизатор выбирает план выполнения, который может максимально быстро вернуть такое количество записей. Обычно оптимизатор пытается выбрать путь, который может эффективно вернуть полный набор результатов. Таким образом, если вы хотите, чтобы набор строк возвращался быстро, вы можете использовать его для извлечения их, но в большинстве случаев использование этой подсказки приведет к более медленному возвращению полного набора результатов, а не к оптимизатору, использующему план выполнения. так.

Просто для уточнения варианта использования: у вас может быть две довольно большие таблицы, которые вам нужно объединить, но вы знаете, что есть только меньший набор данных, с которыми вам нужно работать из одной из них. В этом случае использование FAST для таблицы большего размера без необходимости создания дополнительных индексов / накладных расходов может помочь вместо того, чтобы позволить SQL создавать гигантскую хеш-таблицу в фоновом режиме.

codedawg82
источник
2

Я столкнулся с тем же вопросом пару лет назад при исследовании проблем с производительностью в Dynamics AX. Следуя объяснениям Microsoft, я мог видеть другой план выполнения, вызванный подсказкой, и это соответствует другим ответам, приведенным здесь.

С помощью подсказки SQL Server пытается найти план выполнения, который допускает своего рода потоковую передачу результатов, когда они, например, выходят из вложенного цикла, вместо плана выполнения, который требует, чтобы все записи были прочитаны (и потенциально отсортированы) до будучи выходом.

Единственная проблема в моем случае заключается в том, что SQL-серверу всегда приходилось (несколько) минут возвращать результаты при использовании подсказки, тогда как запрос возвращал результаты (весь набор результатов) в считанные секунды без подсказки ... не совсем то, что ожидалось. Я бы лично использовал эту подсказку с большой осторожностью, а не систематически во всех формах, как в нашей среде Dynamics (ну, больше нет).

Итак, чтобы ответить на OP: как и многие подсказки, это не обязательно помогает улучшить запрос так, как он должен делать (так что ... test, test, test!)

Нельсон 2.0
источник