Вопрос

Я читал на SQL Server 2008 оптимизировать для неизвестного подсказки запроса. Я понимаю, как это работает.

Тем не менее, у меня есть вопрос на куда а также когда использовать его. Он не может быть указан внутри UDF. Он может быть указан внутри сохраненного ProC. Однако, это MSDN Blog Post говорится: следующее:

4. Запрос запроса в хранимую процедуру может поместить его в отдельный процедурный контекст и может быть хорошим способом, чтобы получить это значение, видимое для оптимизатора (Примечание: это работает в SQL 2000)

Мне кажется, что мне говорят, что любой параметр, передаваемый на хранимых процессов, будет «нюхан», тем самым помогая SQL Server скомпилировать оптимальный план выполнения. Это подразумевает, что кэшированный план будет возвращен / переназначен (не уверен в этом механизме). Однако это запутано, потому что он отрицает целую потребность в оптимизации для неизвестных.

Статья MSDN о подсказках запросов не охватывает мой вопрос.

Может ли кто-нибудь ответить на это для меня, в идеале с указателем на что-то от Microsoft, это очищает это. Спасибо.

Это было полезно?

Решение

Поведение по умолчанию компилятора SQL является использование значений любых параметров, приведенных в первом выполнении SP, чтобы помочь оптимизировать план (см. Пункт 2 и 3 Эта статья MSDN о переспиляции SP). Этот план затем кэшируется за повторное использование, пока он не покинет кеш - много деталей в процессе кэширования плана здесь.

Blog MSDN, который вы ссылаетесь, - это отметив способы проще этого процесса для компилятора; Я думаю, что пункт 4 (цитируется в вопросе), предполагает, что это преимущество хранимых процедур над Ad-Hoc SQL.

То OPTIMIZE FOR UNKNOWN Подсказка поручает компилятору авизировать поведение по умолчанию; То, что он должен игнорировать значения параметра, приведенные в первом исполнении, и выбрать более обобщенный план. Это более экстремальная версия пункта 2 в списке предложений в конце процитинга в блоге, приведенном в вопросе;

2 Если вы обнаружите, что оптимизатор выбирает различные планы с течением времени, которые имеют различные характеристики производительности, рассмотрите возможность использования подсказки параметра с представителем «среднего» ценности для получения хорошего, общего плана запроса, который будет работать обоснованно для всех ценностей.

Но вместо того, чтобы выбрать среднее или репрезентативное значение, компилятор эффективно проигнорирует значения параметра целиком.

Рассмотреть возможность использования OPTIMIZE FOR UNKNOWN В данных обстоятельствах, указанных в указанном пункте 2 - когда тот же запрос дает очень переменную производительность, потому что план плохого в некоторых обстоятельствах - как правило, когда параметры в столбцах фильтра запросов очень вариабельной кардинальности.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top