Новая подсказка в запросе: OPTIMIZE FOR

В SQL Server 2005 появилась новая фича, которая позволяет немножко уменьшить "головную боль" от того, что оптимизатор запросов автоматически использует значения параметра, переданного в хранимую процедуру для определения плана исполнения запроса. Детали проблемы хорошо изложены тут: Методика, которая гарантирует в SQL Server 2000 выбор определенного плана исполнения запроса.
Только что наткнулся в BOL на новый и достаточно интересных хинт запроса, далее просто цитирую BOL (не взирая на все неточности и "ляпы" перевода)…

OPTIMIZE FOR - Подсказывает оптимизатору запросов, что возможно использовать частичное значение для локальных переменных, если запрос скомпилирован и оптимизирован. Значение используется только в процессе оптимизации запроса, но не в процессе выполнения. Подсказка OPTIMIZE FOR может быть использована для отмены определений параметров оптимизатором или при создании руководства плана. Дополнительные сведения см. в разделах Перекомпиляция хранимых процедур и Оптимизация запросов в используемых приложениях с помощью руководств планов.

Использование подсказки OPTIMIZE FOR

В следующем пример оптимизатору запросов дается распоряжение использовать значение 'Seattle' для локальной переменной @city_name при оптимизации запроса.

DECLARE @city_name nvarchar(30) SET @city_name = 'Ascheim' SELECT * FROM Person.Address WHERE City = @city_name OPTION ( OPTIMIZE FOR (@city_name = 'Seattle') )

Published Mon, Aug 14 2006 18:18 by gladchenko
Filed under:

Comments

# re: Новая подсказка в запросе: OPTIMIZE FOR

Саша, рад что ты снова начал поддерживать свой блог ;) А фишка optimize for несомненно хороша, в работе вполне может пригодиться.

Thursday, August 17, 2006 7:50 AM by Николай Денищенко

# re: Новая подсказка в запросе: OPTIMIZE FOR

“Optimize For” enhancement in SQL Server 2008: decipherinfosys.wordpress.com/.../optimize-for-enhancement-in-sql-server-2008

Tuesday, February 17, 2009 8:47 AM by gladchenko

Leave a Comment

(required) 
(required) 
(optional)
(required) 
If you can't read this number refresh your screen
Enter the numbers above: