2009-08-20 1 views
4

я читал по документации намеков запросов: http://msdn.microsoft.com/en-us/library/ms181714(SQL.90).aspxДолжен ли я использовать подсказку быстрого вызова number_rows/FASTFIRSTROW?

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

Так что, когда я делаю запрос типа:

Select Name from Students where ID = 444 

Должен ли я заморачиваться с намеком, как это? Предполагая, SQL Server 2005, когда я должен?

- редактировать -

Также следует один беспокоиться, когда ограничение результатов:

Select top 10 * from Students OPTION (FAST 10) 

ответ

1

При использовании TOP х, нет никакой выгоды также используя ВАРИАНТ БЫСТРО х. Оптимизатор запросов уже принимает решения на основе количества строк, которые вы извлекаете. То же самое касается тривиальных запросов, таких как запрос определенного значения из уникального индекса.

Кроме этого, ВАРИАНТ БЫСТРО х может помочь, когда вы знать количество результатов, вероятно, ниже х, но оптимизатор запросов не делает. Конечно, если оптимизатор запросов выбирает неправильные пути для сложных запросов с небольшим количеством результатов, может потребоваться обновление вашей статистики. И если вы ошибаетесь в отношении x, запрос может занять больше времени - почти всегда риск при предоставлении подсказок.

Вышеуказанный оператор не был протестирован - может быть, что все запросов занимают столько же времени, сколько требуется для полного выполнения, если не дольше. Получение первых 10 строк быстро велико, если есть только 8 строк, но теоретически запрос все равно должен выполняться полностью до завершения. Выгода, о которой я думаю, может быть там, потому что выполнение запроса имеет другой путь , ожидающий меньше всего записей, когда на самом деле он действительно пытается получить первый x быстрее. Эти два типа оптимизации могут не совпадать.

1

Для этого конкретного запроса, конечно, нет! Он будет возвращать только один ряд - строку с ID = 444. SQL Server выберет эту строку настолько эффективно, насколько это возможно.

FAST 10 может использоваться в ситуации, когда вы можете сразу использовать первые 10 строк, даже если вы продолжаете ждать дальнейших результатов.

16

Подсказка FAST имеет смысл только при сложных запросах, где есть несколько альтернатив, которые может выбрать оптимизатор. Для простого запроса, такого как ваш пример, он ничего не помогает, оптимизатор запросов сразу же определит, что существует тривиальный план (искать в индексе ID, искать имя, если оно не покрывает), чтобы удовлетворить запрос и пойти на него. Даже если в ID нет индекса, этот план по-прежнему является тривиальным (вероятно, кластерное сканирование).

Чтобы привести пример использования FAST, рассмотрите соединение между A и B с ограничением ORDER BY. Скажем, оценивая объединение B в первую очередь и вложенные циклы, A отличит от ограничения ORDER BY, так что это приведет к быстрым результатам (без необходимости SORT), но более дорогостоящим из-за мощности (B имеет много записей, которые соответствуют WHERE, а A - немного). С другой стороны, оценка B первого и вложенного цикла A создавала бы запрос, который делает меньше IO, следовательно, быстрее в целом, но результат должен быть отсортирован первым, и SORT может начать только после, соединение оценивается, поэтому первый результат придет очень поздно. Оптимизатор обычно выбирает второй план, потому что он более эффективен в целом. Подсказка FAST заставит оптимизатора выбрать первый план, потому что он дает результаты быстрее.

 Смежные вопросы

  • Нет связанных вопросов^_^