Должен ли я использовать Query Hint Fast number_rows / FASTFIRSTROW? - PullRequest
5 голосов
/ 21 августа 2009

Я читал документацию для подсказок запроса: http://msdn.microsoft.com/en-us/library/ms181714(SQL.90).aspx

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

Итак, когда я делаю запрос вроде:

Select Name from Students where ID = 444

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

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

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

Select top 10 * from Students OPTION (FAST 10)

Ответы [ 3 ]

19 голосов
/ 21 августа 2009

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

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

2 голосов
/ 21 августа 2009

При использовании TOP x также невозможно использовать OPTION FAST x . Оптимизатор запросов уже принимает свои решения, основываясь на том, сколько строк вы извлекаете. То же самое касается тривиальных запросов, таких как запрос определенного значения из уникального индекса.

Кроме этого, OPTION FAST x может помочь, когда you знает, что число результатов, вероятно, ниже x , но оптимизатор запросов - нет. Конечно, если оптимизатор запросов выбирает неправильные пути для сложных запросов с небольшим количеством результатов, возможно, потребуется обновить статистику. И если вы неправильно угадаете на x , запрос может занять больше времени - почти всегда риск при даче подсказок.

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

1 голос
/ 21 августа 2009

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

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

...