Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
план-аэроплан
Guest
Нужно посмотреть все имеющиеся в кэше планы для процедуры.
Вот для начала у меня есть запрос из хорошей статьи:

select qs.*, a.attrlist 
from   sys.dm_exec_query_stats qs 
cross  apply sys.dm_exec_sql_text(qs.sql_handle) est 
cross  apply (select epa.attribute + '=' + convert(nvarchar(127), epa.value) + '   '              
			  from  sys.dm_exec_plan_attributes(qs.plan_handle) epa              
			  where  epa.is_cache_key = 1               
			  order  by epa.attribute for xml path('')) as a(attrlist) 
where  est.objectid = object_id ('dbo.MyProc)   
and  est.dbid  = db_id('MyBase') 

Можно ли как-то посмотреть сами планы для полученного списка?
9 июл 12, 10:11    [12837143]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Использовать sys.dm_exec_query_plan
9 июл 12, 10:41    [12837260]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
план-аэроплан
Guest
Glory,

Ок, но такой вариант:
select esp.*
from   sys.dm_exec_query_stats qs 
cross apply sys.dm_exec_sql_text(qs.sql_handle) est 
cross apply sys.dm_exec_query_plan (qs.plan_handle) esp 
cross  apply (select epa.attribute + '=' + convert(nvarchar(127), epa.value) + '   '              
			  from  sys.dm_exec_plan_attributes(qs.plan_handle) epa              
			  where  epa.is_cache_key = 1               
			  order  by epa.attribute for xml path('')) as a(attrlist) 
where  est.objectid = object_id ('dbo.MyProc')   
and  est.dbid  = db_id('MyBase') 


вроде план не вводит, по крайней мере, в поле query_plan одни NULL.

нужно включить какую-то опцию?
9 июл 12, 10:51    [12837326]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
план-аэроплан
нужно включить какую-то опцию?

нет
9 июл 12, 10:53    [12837341]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
план-аэроплан
Guest
Glory,

Ок, а в чем может быть проблема?
Сейчас посмотрел - для других процедур план вывелся.
Для этой - везде NULL.
9 июл 12, 11:04    [12837424]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
план-аэроплан
Ок, а в чем может быть проблема?

В неправильном запросе.
Начните с документированных примеров из хелпа

B. Retrieve every query plan from the plan cache
To retrieve a snapshot of all query plans residing in the plan cache, retrieve the plan handles of all query plans in the cache by querying the sys.dm_exec_cached_plans dynamic management view. The plan handles are stored in the plan_handle column of sys.dm_exec_cached_plans. Then use the CROSS APPLY operator to pass the plan handles to sys.dm_exec_query_plan as follows. The XML Showplan output for each plan currently in the plan cache is in the query_plan column of the table that is returned.
USE master;
GO
SELECT * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle);
GO
9 июл 12, 11:08    [12837443]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 891
план-аэроплан,
значит план уже удалился из кеша, либо его там не было.
попробуйте выполнить процедуру, и заново просмотреть кеш
9 июл 12, 11:10    [12837454]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
план-аэроплан
Guest
Glory,

Чем тот запрос был неправильным?

Запрос:
select esp.query_plan
from sys.dm_exec_cached_plans cp 
cross apply sys.dm_exec_query_plan(cp.plan_handle) esp
where esp.objectid = object_id ('dbo.MyProc')   
and esp.dbid  = db_id('MyBase') 
дает две записи со значением NULL в поле query_plan.

Для другой процедуры план выводит.

Т.е. ситуация в том, что планы есть и запрос выводит нужные строчки, но для некоторых процедур в поле query_plan - пустое значение.
9 июл 12, 14:41    [12838954]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
план-аэроплан
Guest
Slava_Nik,

см. ответ Glory
9 июл 12, 14:42    [12838963]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
план-аэроплан
Guest
Стал искать особенности в процедуре, в которой были NULL в поле query_plan.

Нашел и проверил на других процедурах, что если у нас в процедуре есть конструкция типа (упрощенно):
create table #gg(gg int primary key)
if 1=2
insert #gg(gg) values (3)
то запросы указанные выше (что один, что другой) даст записи, в которых будет NULL в поле query_plan.

Есть какое-то этому обьяснение?
9 июл 12, 16:41    [12839949]     Ответить | Цитировать Сообщить модератору
 Re: Нужно посмотреть все имеющиеся в кэше планы для процедуры.  [new]
план-аэроплан
Guest
план-аэроплан
Стал искать особенности в процедуре, в которой были NULL в поле query_plan.

Нашел и проверил на других процедурах, что если у нас в процедуре есть конструкция типа (упрощенно):
create table #gg(gg int primary key)
if 1=2
insert #gg(gg) values (3)
то запросы указанные выше (что один, что другой) даст записи, в которых будет NULL в поле query_plan.

Есть какое-то этому обьяснение?
при этом в процедуре есть еще масса запросов.
а условие скорее не 1=2, а dbo.MyFunction(@CalculatedPar) = 1
9 июл 12, 16:45    [12839988]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить