2009-10-13 3 views
0

Выполняет ли sql-сервер выполнение плана выполнения функций?Функции в SQL Server 2008

+0

См: http://sqlblog.com/blogs/tibor_karaszi/archive/2007/06/14/are-execution-plans-for-functions- cached.aspx –

ответ

2

Согласно dmv yes, http://msdn.microsoft.com/en-us/library/ms189747.aspx, но мне нужно будет запустить тест для подтверждения.

Идентификатор объекта на выходе: «Идентификатор объекта (например, хранимая процедура или пользовательская функция) для этого плана запроса».

Протестировано и да, похоже, что они получают отдельную запись в кэш плана.

Test Script:

create function foo (@a int) 
    returns int 
as 
begin 
    return @a 
end 

Самый основной из функций, созданных.

-- clear out the plan cache 
dbcc freeproccache 
dbcc dropcleanbuffers 
go 

-- use the function 
select dbo.foo(5) 
go 

-- inspect the plan cache 
select * from sys.dm_exec_cached_plans 
go 

Кэш плана затем имеет 4 записи, один в списке, как OBJTYPE = Proc является план кэша функции, возьмите ручку и взломать его открытым.

select * from sys.dm_exec_query_plan(<insertplanhandlehere>) 

Первый АПЧРК на моем тесте был фактический запрос, то второй АПЧРК был запрос с просьбой для кэша плана. Таким образом, он определенно получил отдельную запись под другим типом proc для выдаваемого adhoc-запроса. Ручка плана также отличалась, и при извлечении с помощью дескриптора плана он возвращает идентификатор объекта исходной функции, в то время как запрос adhoc не предоставляет идентификатор объекта.

2

Да, см. Ссылку Тиброра Рексема и ответ Эндрю.

Однако ... простая функция значения таблиц во всяком случае не заполняется/расширяется во внешний запрос. Как вид. And my answer (with links) here

То есть, этот тип:

CREATE FUNC dbo.Foo() 
RETURNS TABLE 
AS 
RETURN (SELECT ...) 
GO