답변:
예.
지정하지 않으면 WITH SCHEMABINDING
SQL Server는 일반적으로 함수 본문에서 수행하는 세부 검사를 건너 뜁니다. 그것은 단순히 함수가 데이터에 액세스하는 것으로 표시합니다 (질문에 주어진 링크에서 언급했듯이).
이것은 성능 최적화입니다. 이 가정을하지 않으면 SQL Server는 바인딩되지 않은 함수가 언제든지 변경 될 수 있으므로 모든 함수 호출에 대한 자세한 검사를 수행해야합니다.
있다 다섯 개 중요한 기능 특성 :
예를 들어, 다음 언 바운드 스칼라 함수를 사용하십시오.
CREATE FUNCTION dbo.F
(
@i integer
)
RETURNS datetime
AS
BEGIN
RETURN '19000101';
END;
메타 데이터 함수를 사용하여 5 가지 속성을 볼 수 있습니다.
SELECT
IsDeterministic = OBJECTPROPERTYEX(Func.ID, 'IsDeterministic'),
IsPrecise = OBJECTPROPERTYEX(Func.ID, 'IsPrecise'),
IsSystemVerified = OBJECTPROPERTYEX(Func.ID, 'IsSystemVerified'),
UserDataAccess = OBJECTPROPERTYEX(Func.ID, 'UserDataAccess'),
SystemDataAccess = OBJECTPROPERTYEX(Func.ID, 'SystemDataAccess')
FROM (VALUES(OBJECT_ID(N'dbo.F', N'FN'))) AS Func (ID);
두 개의 데이터 액세스 특성이 true로 설정되었고 다른 세 가지 특성이 false로 설정되었습니다 .
예를 들어 인덱싱 된 뷰나 인덱싱 된 계산 열에서 사용하는 것 이상의 의미가 있습니다.
결정론의 특정의 속성은 쿼리 최적화에 영향을 미칩니다. 재 작성 및 조작 유형에 관한 자세한 규칙이 있으며 결정적이지 않은 요소에 대해서는 매우 제한적 입니다. 부작용은 매우 미묘 할 수 있습니다.
예를 들어 다음 두 테이블을 고려하십시오.
CREATE TABLE dbo.T1
(
SomeInteger integer PRIMARY KEY
);
GO
CREATE TABLE dbo.T2
(
SomeDate datetime PRIMARY KEY
);
... 그리고 함수를 사용하는 쿼리 (이전에 정의 된대로) :
SELECT *
FROM dbo.T1 AS T1
JOIN dbo.T2 AS T2
ON T2.SomeDate = dbo.F(T1.SomeInteger);
쿼리 계획은 예상대로 테이블 T2에 대한 탐색을 특징으로합니다.
그러나 파생 테이블 또는 공통 테이블 표현식을 사용하여 동일한 논리적 쿼리를 작성하는 경우 :
WITH CTE AS
(
SELECT *, dt = dbo.F(T1.SomeInteger)
FROM dbo.T1 AS T1
)
SELECT *
FROM CTE
JOIN dbo.T2 AS T2
ON T2.SomeDate = CTE.dt;
-- Derived table
SELECT
*
FROM
(
SELECT *, dt = dbo.F(T1.SomeInteger)
FROM dbo.T1 AS T1
) AS T1
JOIN dbo.T2 AS T2
ON T2.SomeDate = T1.dt;
실행 계획은 이제 스캔에 기능이 있으며, 함수에 관련된 술어가 필터에 붙어 있습니다.
파생 테이블 또는 공통 테이블 표현식이 뷰 또는 인라인 함수로 대체되는 경우에도 발생합니다. FORCESEEK
힌트 (및 기타 유사한 시도가) 실패합니다 :
근본적인 문제는 쿼리 최적화 프로그램 이 비 결정적 쿼리 요소를 자유롭게 재정렬 할 수 없다는 것 입니다.
탐색을 생성하려면 필터 조건자를 계획 아래로 T2 데이터 액세스로 이동해야합니다. 이 결정은 기능이 비 결정적 일 때 방지됩니다.
이 예제의 수정에는 두 단계가 포함됩니다.
WITH SCHEMABINDING
첫 번째 단계는 간단합니다. 두 번째는 문자열에서 비 결정적 암시 적 캐스트를 제거하는 단계입니다 datetime
. 결정 론적으로 대체 CONVERT
. 그 자체로는 충분하지 않습니다 .
ALTER FUNCTION dbo.F
(
@i integer
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
-- Convert with a deterministic style
RETURN CONVERT(datetime, '19000101', 112);
END;
기능 속성은 다음과 같습니다.
옵티마이 저가 해제되면 모든 예제는 이제 원하는 탐색 계획을 생성합니다 .
해당 구문에서 변환 스타일을 지정할 수 없으므로 함수에서 CAST
to 를 사용하면 datetime
작동하지 않습니다.
ALTER FUNCTION dbo.F
(
@i integer
)
RETURNS datetime
WITH SCHEMABINDING
AS
BEGIN
-- Convert with a deterministic style
RETURN CAST('19000101' AS datetime);
END;
이 함수 정의는 스캔 계획을 생성하며 특성에 따라 결정적이지 않은 것으로 표시됩니다.