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

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

Прочитал в интеренете про данную конструкция, понял, что ее надо ставить, когда необходимо сохранить порядок соединения

Подскажите, пожалуйста, при каких запросах, или как определить, что данная конструкия необходима?

Заранее благодарен за ответы
26 сен 13, 12:06    [14886592]     Ответить | Цитировать Сообщить модератору
 Re: option(force order)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
user87
Подскажите, пожалуйста, при каких запросах, или как определить, что данная конструкия необходима?


В тех запросах, при выборе плана выполнения которых оптимизатор изменил порядок соединения и это план получается хуже, чем план при оригинальном порядке соединения.
26 сен 13, 12:33    [14886784]     Ответить | Цитировать Сообщить модератору
 Re: option(force order)  [new]
Гость333
Member

Откуда:
Сообщений: 3683
user87
понял, что ее надо ставить, когда необходимо сохранить порядок соединения

Подскажите, пожалуйста, при каких запросах, или как определить, что данная конструкия необходима?

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

Однако, прежде чем указывать любой хинт, неплохо было бы разобраться, почему оптимизатор не построил оптимальный план выполнения. Это может быть из-за устаревшей статистики, "неудачного" сочетания условий запроса (когда условия коррелируют друг с другом — оптимизатор же полагает, что все условия независимы), использования табличных переменных и т.д. и т.п.

Наконец, у оптимизатора есть некий лимит времени на построение запроса. Если за отведенное время оптимальный план так и не был найден, то будет выбран лучший из обработанных. Например, если в запросе соединяются 15 таблиц, то максимальное число возможных порядков их соединения будет равно 15! = 1,3 триллиона. Понятно, что за приемлемое время перебрать все варианты не удастся. (Но, естественно, в оптимизатор заложены алгоритмы, существенно сокращающие перебор).

В общем, перед указанием хинта сначала нужно попробовать решить проблему каким-то другим способом (обновить статистику, разбить запрос на несколько более мелких и т.п.). И хинтовать, когда это не помогло.
26 сен 13, 12:44    [14886862]     Ответить | Цитировать Сообщить модератору
 Re: option(force order)  [new]
user87
Member

Откуда:
Сообщений: 257
Спасибо большое за советы
26 сен 13, 13:14    [14887029]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить