Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 теоритический вопрос option(fast 1)  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Добрый день.

Хотел бы задать теоритический вопрос по поводу опции option(fast 1)
Как я понял из документации, данный хинт служит для немедленного вывода информации на клиент, если я конечно правильно понял.

Далее на тестовой бд

select e.*
from HumanResources.Employee e --with (forceseek)
where e.Gender = 'F' and e.SickLeaveHours = 59 and e.MaritalStatus = 'M'
estimated cost = 0.007(index seek)
а если

select e.*
from HumanResources.Employee e --with (forceseek)
where e.Gender = 'F' and e.SickLeaveHours = 59 and e.MaritalStatus = 'M'
option(fast 1)
estimated cost = 0.005(index scan)

Подскажите, пожалуйста, по Вашему собственному опыту, когда лучше использовать данную опцию?
23 окт 13, 13:29    [15020312]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
aleks2
Guest
Опция fast 1 заставляет оптимизатор строить план так, чтобы максимально быстро получить ПЕРВУЮ строку рекордсета и начать передачу данных на клиента.

А вовсе не для "немедленного вывода информации на клиент".

ИльдарSR
Подскажите, пожалуйста, по Вашему собственному опыту, когда лучше использовать данную опцию?

Когда клиент нетерпеливый.
23 окт 13, 13:36    [15020355]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
komrad
Member

Откуда:
Сообщений: 5735
ИльдарSR
Подскажите, пожалуйста, по Вашему собственному опыту, когда лучше использовать данную опцию?


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

в Siebel, например, часто вижу в запросах FAST 40
23 окт 13, 13:39    [15020375]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Спасибо большое
23 окт 13, 15:04    [15021117]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Ну, и не стоит забывать, что клиент должен уметь выполнять и фечить запрос асинхронно.
23 окт 13, 15:13    [15021205]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
pkarklin,

а то еще и кенселить уметь. ибо достаточно часто запросы с option ( fast ) работают очень долго, что неплохо иллюстрируется стартовым сообщением - индекс будет сканироваться (!) до получения "полного удовлетворения". а в случае отсутствия top (что как раз присутствует в стартовом примере) - так и вообще "до упора"
23 окт 13, 16:13    [15021798]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleks2
Опция fast 1 заставляет оптимизатор строить план так, чтобы максимально быстро получить ПЕРВУЮ строку рекордсета и начать передачу данных на клиента.
Если я правильно понимаю, то он заставляет вообще брать первый попавшийся план. Т.е. это спасает от долгой компиляции.

Хотя для Top(1) уже скорее обрезается в подборе планов, ИМХО и к тому же для совсем простых запросов итак используется урезанный оптимизатор.

Не?
24 окт 13, 00:21    [15023645]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mnior
fast 1 ... заставляет вообще брать первый попавшийся план

Не?

Не.

BOL -> Query Hints
FAST number_rows

Specifies that the query is optimized for fast retrieval of the first number_rows. This is a nonnegative integer. After the first number_rows are returned, the query continues execution and produces its full result set.


Возьмите, к примеру, AdventureWorks и посмотрите план запроса:
select *
from Sales.SalesOrderDetail d
     inner join Sales.SalesOrderHeader h on h.SalesOrderID = d.SalesOrderID

Таблица заголовков (Estimated Number of Rows = 30000) будет соединена с таблицей детализаций (Estimated Number of Rows = 120000) при помощи MERGE JOIN, предполагаемое число строк на выходе — 120000.

Теперь допишем, например, OPTION(FAST 20).
План кардинально меняется: таблицы соединяются через LOOP JOIN, для заголовочной таблицы будет Estimated Number of Rows = 5.2, каждой строке заголовка соответствует 3.8 строки детализации, предполагаемое число строк на выходе = 20. В общем, как и было заказано.
24 окт 13, 10:46    [15024577]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Извините за глупый вопрос, получается если применять данную опцию, то план время выполнения всегда быстрей получается?

На Вашем примере попробовал, время выполнения координально отличается, по идее я могу в каждом запросе такую опцию прописать?
24 окт 13, 10:52    [15024621]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Glory
Member

Откуда:
Сообщений: 104751
ИльдарSR
по идее я могу в каждом запросе такую опцию прописать?

Если вам в каждом запросе нужна только одна запись, то зачем вы выбираете остальные ?
24 окт 13, 10:59    [15024681]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
ИльдарSR
Извините за глупый вопрос, получается если применять данную опцию, то план время выполнения всегда быстрей получается?

На Вашем примере попробовал, время выполнения координально отличается, по идее я могу в каждом запросе такую опцию прописать?

всегда медленнее. Но 1 строка появляется быстрее.
24 окт 13, 11:06    [15024735]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
В том том то и дело, что не одна, и как раз резалсет получается не из одной строки, хотя план намного быстрее работает

select *
from Sales.SalesOrderDetail d
inner join Sales.SalesOrderHeader h on h.SalesOrderID = d.SalesOrderID

select *
from Sales.SalesOrderDetail d
inner join Sales.SalesOrderHeader h on h.SalesOrderID = d.SalesOrderID
option(fast 20)

Но скорее всего я чего то недопонимаю(
24 окт 13, 11:07    [15024746]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Crimean
Member

Откуда:
Сообщений: 13147
ИльдарSR,

для вас данные "удачные". при неудачных 1я строка будет быстрее, вся обработка - медленнее. и чем больше и "неудачнее" данных тем медленнее.
24 окт 13, 11:11    [15024776]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Glory
Member

Откуда:
Сообщений: 104751
ИльдарSR
В том том то и дело, что не одна, и как раз резалсет

А сколько ? 1000 ? Миллион ?

ИльдарSR
хотя план намного быстрее работает

Быстрее для чего ? Для первых 20 - быстрее. А остальных, которые вам тоже нужны, как вы утверждаете ?
24 окт 13, 11:12    [15024780]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
ИльдарSR
Member

Откуда:
Сообщений: 466
Да для остальных как-то все печально(((

Спасибо большое за объяснения.
24 окт 13, 11:16    [15024818]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Гость333
MERGE JOIN
И? Это ничего не доказывает!
Как вы опровергните что в случае OPTION(FAST) не берётся первый попавшийся план? Вот без опции оптимизатор берёт следующий (LOOP отбросил).

Возьмите два случая:
SELECT Top(20) ...
SELECT Top(20) ... OPTION(FAST 20)
И найдите что планы отличаются.

Если они никогда не отличаются - то смысла в FAST практически нуль.
Во всяком случае следующее утверждение нужно отбросить:
Crimean
а то еще и кенселить уметь


А вот OPTION(FAST 100500) я не заметил сразу. Т.е. всётаки можно задать количество и тут нужно анализить статику.
Вот это и опровергает моё предположение. А я подумал о FAST FIRST ROW.
24 окт 13, 16:43    [15027633]     Ответить | Цитировать Сообщить модератору
 Re: теоритический вопрос option(fast 1)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Mnior
Гость333
MERGE JOIN
И? Это ничего не доказывает!
Как вы опровергните что в случае OPTION(FAST) не берётся первый попавшийся план?

Я опроверг это цитатой из хелпа. Дальше была так, лирика.
24 окт 13, 17:59    [15028089]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить