2009-10-13 7 views
0

SQL Server는 함수의 실행 계획을 캐시합니까?SQL Server 2008의 함수

+0

를 참조하십시오 http://sqlblog.com/blogs/tibor_karaszi/archive/2007/06/14/are-execution-plans-for-functions- cached.aspx –

답변

2

dmv 예에 따르면, http://msdn.microsoft.com/en-us/library/ms189747.aspx하지만 확인하려면 테스트를 실행해야합니다.

출력의 개체 ID는 "이 쿼리 계획에 대한 개체 ID (예 : 저장 프로 시저 또는 사용자 정의 함수)입니다".

테스트 해본 결과 별도의 계획 캐시 항목이있는 것처럼 보입니다.

테스트 스크립트 :

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>) 

내 테스트의 첫 번째 애드혹은 2 애드혹가 계획 캐시를 요청하는 쿼리이었다, 실제 쿼리이었다. 그래서 그것은 분명히 발행되는 adhoc 질의와 다른 proc 유형 하에서 별도의 엔트리를 받았다. 플랜 핸들은 또한 다르며 플랜 핸들을 사용하여 추출 할 때 원래의 함수에 오브젝트 ID를 제공하는 반면, 임시 쿼리는 오브젝트 ID를 제공하지 않습니다.

2

예, rexem의 Tibor 링크 및 Andrew의 답변을 참조하십시오.

그러나 ... 간단한 테이블 값 함수는 외부 쿼리로 중첩/확장되지 않습니다. 보기처럼. 이다 And my answer (with links) here

이 유형 :

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