sp_create_plan_guide - корректная работа с query_plan

aleksey_fomchenko
Дата: 03.06.2011 07:22:09
Добрый день,

Столкнулся с вот каким вопросом:
некоторые процудуры имеют пустое поле query_plan если просматривать системное представлении sys.dm_exec_query_plan.

Хотя, процудуры выполняються многократно (поля plan_generation_num не большое и execution_count большое соответственно).

Говорит ли это о том, что плана для таких рапросов сервером переиспользовать нельзя?
Или он перегенерится все время заново?

Планирую фиктировать планы использую sp_create_plan_guide.
Ео с ходу побороть задачу не вышло, так как полезли ошибки не соответствия планов коду и т.д. на этапе создания планов соответственно.
Так вот, стоит ли работать с такими объектами как с SQL или OBJECT входящими типами для sp_create_plan_guide?

Могу конечно собирать планы через профайлер и пихать по отдельнопу план-гайду на батч, но это конечно не сильно кузяво.

Спасибо большое за ваши соображения.
Mnior
Дата: 03.06.2011 09:29:52
У вас проблемы или "пощупать" хотите?
aleksey_fomchenko
Дата: 05.06.2011 07:40:10
Да, задолбался уже оптимизировать запросы, так как обслуживание баз произвожу не я и не могу гарантировать, что и со статистикой все в норме и индексы оптимизированы.
Решил, что зафиксировать планы исполнения будет надежнее.
Mnior
Дата: 05.06.2011 16:37:05
О parameter sniffing знать обязательно, + в тех топиках есть советы
Закрепить план можно косвенно в самом тексте запроса (OPTION), например: OPTIMIZE FOR (@variable_name = literal_constant [ , ...n ] )
Указав значения для параметров с подходящием планом. Тогда новые данные никак не повлияют.
Mnior
Дата: 05.06.2011 16:49:39
aleksey_fomchenko
задолбался уже оптимизировать запросы
Оптимизировать запросы надо. А при разработке и тестировании учитывать реальные объёмы данных. Планы надо смотреть и анализировать для всех запросов.
KO
aleksey_fomchenko
Дата: 06.06.2011 17:21:43
To Mnior

Ответ не по теме, так как я спрашивал не технотогию закрепления плана, а почему частенько поле query_plan пустое в системном представлении sys.dm_exec_query_plan.
Собственно оптимизацию руками так и делаю.
Но нужно фиксировать планы работающие хорошо в настоящий момент.
--__Александр__--
Дата: 07.06.2011 08:20:23
http://msdn.microsoft.com/ru-ru/library/ms189747(v=SQL.90).aspx

При следующих условиях вывод инструкции Showplan не возвращается в столбец query_plan возвращаемой таблицы для функции sys.dm_exec_query_plan.

Если план запроса, определенный использованием аргумента plan_handle, извлекается из кэша планов, столбец query_plan возвращаемой таблицы имеет значение NULL. Например, такое условие может возникнуть при наличии задержки между принятием и использованием дескриптора плана функцией sys.dm_exec_query_plan.

Некоторые инструкции Transact-SQL не кэшируются, к ним относятся инструкции массовых операций, а также инструкции, содержащие строковые литералы размером более 8 КБ. Для таких инструкций нельзя получить представление Showplan в формате XML, используя функцию sys.dm_exec_query_plan, если пакет не выполняется в данный момент, потому что они не существуют в кэше.

Если пакет Transact-SQL или хранимая процедура содержат вызов пользовательской функции или динамической инструкции SQL, например при помощи EXEC (string), скомпилированная инструкция Showplan в формате XML для пользовательской функции не включается в таблицу, возвращаемую функцией sys.dm_exec_query_plan для пакета или хранимой процедуры. Вместо этого необходимо отдельно вызвать функцию sys.dm_exec_query_plan для дескриптора плана, соответствующего пользовательской функции.